01_FreeRTOS在stm32f103上的移植
2018-03-05 14:28
316 查看
FreeRTOS在stm32f103上的移植
1. FreeRTOS下载包文件结构
下载包目录包含两个子目录:FreeRTOS和FreeRTOS-Plus。现在只关心FreeRTOS下的文件。在FreeRTOS文件下下包含如下文件:FreeROTS |+--Demo 包含演示工程历程 |+--License |+--Source 包含实时内核源文件。
在Source文件夹下包含RTOS的三个核心代码文件: tasks.c、queue.c、list.c。在该目录下还包含可选文件: timers.c、event_groups.c、croutine.c,分别实现软件定时、事件组和协程功能。
FreeRTOS/Source目录结构如下所示:
FreeROTS |+--Source 包含实时内核源文件。 |+--include RTOS内核代码头文件 |+--portable 处理器特定代码 |---croutine.c 协程功能源码文件 |---event_groups.c 事件组源码文件 |---list.c RTOS核心源码文件 |---queue.c RTOS核心源码文件 |---tasks.c RTOS核心源码文件 |---timers.c 软件定时器源码文件
在portable目录下,包含了需要移植的代码,在该目录下包含2方面内容:编译器移植包和内存堆实现范例。
|+--portable 处理器特定代码 |+--Compiler xxx 支持编译器xxx的所有移植包 |+--MemMang 内存堆实现范例
2.移植FreeRTOS到stm32f103
根据前面的表述,移植FreeRTOS主要是移植…\FreeRTOS\Source\portable\目录下的文件,在该目录下根据自己编译器和需要选择的内存堆管理文件进行移植。现在以IAR为例,移植FreeRTOS。2.1、添加RTOS核心代码
a、添加FreeRTOS核心文件: list.c、queue.c、tasks.c 到工程。 b、添加编译器相关的文件到工程,即添加...\FreeRTOS\Source\portable\IAR\ARM_CM3下的文件到工程。 c、添加内存管理文件到工程,即添加...\FreeRTOS\Source\portable\MemMang\heap_4.c (这选择heap_4.c)。 d、将 ...\FreeRTOS\Demo\CORTEX_STM32F103_IAR\FreeRTOSConfig.h复制到自己的工程中。 e、在工程中设置编译器IAR需要查找的头文件库。
2.2、挂接中断
在Cortex-M3硬件下,FreeRTOS使用SysTick作为系统节拍时钟,使用SVC和PendSVC进行上下文切换。异常中断服务代码位于…\FreeRTOS\Source\portable\IAR\ARM_CM3\port.c文件中,FreeRTOS已经为各种构架的CPU写好了这些代码,可以直接拿来用,需要做的是将这些异常中断的入口地址挂接到启动代码中。在 FreeRTOSConfig.h 添加如下定义:#define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler #define xPortSysTickHandler SysTick_Handler
2.3、建立第一个任务
#include "stm32f10x.h" #include "stm32f10x_conf.h" #include "uart1.h" #include <stdio.h> #include "FreeRTOS.h" #include "task.h" #define UART1_BAND (115200) /* 任务优先级 */ #define TASK1_PRIO 1 /* 任务堆栈大小 */ #define TASK1_STAK_SIZE 256 /* 任务句柄 */ TaskHandle_t Task1_Handler; void vTask1(void *pvParameters) { for(;;) { printf("vTask1任务运行\r\n"); vTaskDelay(1000/portTICK_PERIOD_MS); } } int main(void) { vUart1Init(UART1_BAND); xTaskCreate((TaskFunction_t )vTask1, /* 任务函数 */ (const char* )"vTask1", /* 任务名称 */ (uint16_t )TASK1_STAK_SIZE, /* 任务堆栈大小 */ (void* )NULL, /* 传递给任务函数的参数 */ (UBaseType_t )TASK1_PRIO, /* 任务优先级 */ (TaskHandle_t* )&Task1_Handler); /* 任务句柄 */ vTaskStartScheduler(); /* 开启任务调度 */ }
至此移植工作完成。
3、FreeRTOSConfig.h中的一些设置
3.1、设置节拍时钟
configCPU_CLOCK_HZ (你的硬件平台CPU系统时钟,Fcclk)configTICK_RATE_HZ ((portTickType)100)
第一个宏定义CPU系统时钟,也就是CPU执行时的频率。第二个宏定义FreeRTOS的时间片频
率,这里定义为100,表明RTOS一秒钟可以切换100次任务,也就是每个时间片为10ms
3.2、设置中断优先级相关宏
#ifdef __NVIC_PRIO_BITS #define configPRIO_BITS __NVIC_PRIO_BITS #else #define configPRIO_BITS 4 #endif #define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 //中断最低优先级 #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 //系统可管理的最高中断优先级 /* 设置内核使用的中断优先级 */ #define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) ) 94ee /* 定义RTOS可以屏蔽的最大中断优先级,大于这个优先级的中断,不受RTOS控制 */ #define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
关于FreeRTOS的其它配置宏后面用到再描述。
相关文章推荐
- FreeRTOS移植到STM32F103步骤与注意事项
- FreeRTOS简单移植到STM32F103ZET6
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
- freertos 移植到stm32f103
- STM32f103 ds18b20 驱动程序移植
- [置顶] 基于stm32f103zet6的FAT16文件系统学习2(初步移植ff9a)
- ucos-II(2.86)移植到STM32F103VET6
- FreeRTOS的源代码个人分析(基于KEIL下STM32F103的Demo) 五
- freertos 在arm926-ejs上的移植
- FreeRTOS的源代码个人分析(基于KEIL下STM32F103的Demo) 六
- FreeRTOS 移植
- FreeRTOS 移植要点(1)
- FreeRTOS 移植要点(2)
- STM32上移植FreeRTOS
- FreeRTOS移植--时钟寄存器和串口寄存器
- stm32移植FreeRTOS——port.c: Internal fault: [0xafc2db:400524]
- 移植FreeRTOS一定要修改startup_stm32f10x_hd.s的启动文件吗?
- FreeRTOS9.0的移植-Keil-STM32F107VC
- FreeRTOS移植笔记(一)创建工程模板
- IAR(EWARM)下移植FreeRTOS到STM32F10x笔记