STM32 移植Freertos

来源:互联网 发布:电线电缆报价软件 编辑:程序博客网 时间:2024/05/17 06:03
STM32 移植Freertos

     前言:操作系统在嵌入式开发中可能是无论如何也绕不过去的,原来的工作中一直在“裸奔”,对操作系统不是很了解,借助freertos/ucos对操作系统的相关功能和机制进行研究和总结。

一、准备与分析
1.1 下载源码     
     到Freertos官网下载最新源码,我下载的是8.2.0版本,下载FreeRTOSV8.2.0.exe应用程序,将源码解压至工作目录。

1.2 目录结构
     Freertos的源码目录是以编译器为大类,然后以平台为小类,比如在Freertos/Source/portable目录下包括很多编译器的子文件夹,IAR/GCC等等,根据自己的编译器进行选择,例如我使用的是IAR,IAR文件夹下则包括了很多硬件平台的子文件夹,ARM_CM3/MSP430等,这里使用的是ARM_CM3。可以看出Freertos对很对不同平台的支持很好,可以很方便的移植到不同的硬件平台。

1.3 所需文件
     与操作系统相关的文件只有三个:queue.c/list.c/tasks.c 位于FreeRTOS\Source目录下
     与平台相关的文件包括:port.c/portasm.s/poatmacro.h三个文件,位于FreeRTOS\Source\portable\IAR\ARM_CM3目录下
     与内存分配相关的文件位于FreeRTOS\Source\portable\MemMang目录下,这里使用heap_2.c
     相关头文件在FreeRTOS\Source\include目录下
     操作系统的相关配置文件FreeRTOSConfig.h在FreeRTOS\Demo\CORTEX_STM32F103_IAR目录下

二、建立工程并配置环境
     建立IAR工程文件,添加相关文件,这里使用的固件V3.5,添加Freertos相关文件到工程,进行硬件型号与配置头文件路径等配置工作,这里不要忘记汇编头文件的路径,与平台相关的代码中包含了一个汇编文件。

C头文件路径:
$PROJ_DIR$\CMSIS
$PROJ_DIR$\STM32F10x_StdPeriph_Driver\src
$PROJ_DIR$\STM32F10x_StdPeriph_Driver\inc
$PROJ_DIR$\Freertos\include
$PROJ_DIR$\Freertos\portable
$PROJ_DIR$\Freertos
$PROJ_DIR$\StartUp
$PROJ_DIR$\BSP
$PROJ_DIR$\APP

汇编头文件路径:
$PROJ_DIR$\APP

三、修改启动代码
由于startup_stm32f10x_md.s文件中的中断向量名称在portasm.s中被重定义了,所以需要修改中断向量名称并做外部声明。修改startup_stm32f10x_md.s文件如下:


四、呼吸灯例程
#include "FreeRTOS.h"#include "task.h"#include "stm32f10x.h"#define LED1_ON() GPIO_SetBits(GPIOA,GPIO_Pin_11)#define LED1_OFF() GPIO_ResetBits(GPIOA,GPIO_Pin_11)void vLEDTask( void *pvParameters ){    for( ;; )    {        LED1_ON();        vTaskDelay( 1000/portTICK_RATE_MS );        LED1_OFF();        vTaskDelay( 1000/portTICK_RATE_MS );    }}static void prvSetupHardware( void ){    vLedInit();}void vLedInit( void ){    GPIO_InitTypeDef GPIO_InitStructure;    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12;    GPIO_Init(GPIOA, &GPIO_InitStructure);    }int main( void ){    prvSetupHardware();    xTaskCreate( vLEDTask, "LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL );    vTaskStartScheduler();    return 0;} 

参考博文

印象笔记为什么不增加调整行间距的功能呢?
0 0
原创粉丝点击