基于S32K144 移植 FreeRTOS 10.1.1
转自:https://www.jianshu.com/p/d4c53f63c686
内容目录
一、FreeRTOS 源码的获取
二、移植 FreeRTOS
参考文献
一、FreeRTOS 源码的获取
图 1-1 FreeRTOS 官方网站.png
点击左边的【Download Source】,选择相应的方式下载源码:
图 1- 2 FreeRTOS 下载.png
【Latest News】显示的是当前 FreeRTOS 的版本信息和支持的一些芯片信息,点击【Download Source Code and Projects】后,稍等一会就会自动下载官方的 .exe 文件:FreeRTOSv10.1.1.exe,双击运行,选择安装目录,等待完成,目录结构如下:
图 1- 3 FreeRTOS 目录结构.png
① FreeRTOS : 主要存放的是 OS 的源码和 DEMO;
② FreeRTOS-Plus : 主要存放的是 OS 的一些扩展功能,比如 TCP/IP;
我们目前要使用的是 FreeRTOS 目录的内容:
图 1- 4 FreeRTOS 目录结构.png
① DEMO :FreeRTOS 给各个厂商开发的例程文件;
② License : 里面存放了 license 说明文档;
③ Source : 内核代码文件,移植主要用到的文件都在这里面;
图 1- 5 Source 目录结构.png
① include : 存放的事通用的头文件
② portable : 与编译器有关的代码,里面存放着不同编译器的工程文件;
这时候我们需要的文件目录大概就是:
① Source 目录下的文件
② Source 目录下的 include 文件夹
③ Source 目录下的 portable 文件夹下面的MemMang 和 RVDS
④ Demo 目录下的例程里面的FreeRTOSConfig.h 文件
二、移植 FreeRTOS
基于裸板的 Driver 的工程已经完成,现在就把 FreeRTOS 移植过来,在工程目录新建文件夹:
① src : 把 FreeRTOS 目录下的源文件都放进来,除了 include 文件夹和 portable 文件夹
② include : 把 FreeRTOS 目录下的 include 文件夹复制过来
③ portable : 把 RVDS 文件夹和 Memmang 文件夹复制过来
图 2- 1 src 文件夹.png
图 2- 2 include 文件夹.png
图 2- 3 portable 文件夹.png
在工程里面添加组,并把相应文件都添加进来:
① freertos/src :把所有 src 文件夹里面的源文件都添加进来
② freertos/portable : 把 MemMang 文件夹的 heap_4.c 和 RVDS/ ARM_CM4F/port.c 添加进来
③ app : 把Demo 里面的CORTEX_M4F_STM32F407ZG-SK 的FreeRTOSConfig.h 复制到 app 文件夹
图 2- 4 工程组结构.png
图 2- 5 设置 FreeRTOS 头文件路径.png
图 2- 6 添加 FreeRTOS 头文件.png
先进行一次编译,发现报错:
图 2- 7 首次编译报错.png
从报错的内容看,都是缺少定义后缀为 Hook 的函数,这些函数都是钩子函数,我们在提示错误的源文件里面都能找到相应的函数声明:
图 2- 8 缺少定义的钩子函数.png
因为我们在 FreeRTOSConfig.h 里面打开了一些宏定义,这些宏定义打开后,源文件会使用这些钩子函数,这里我们只要把这些钩子函数定义一下就行了,在 main.c 我们把这几个钩子函数都定义出来:
/* hook function,no using,avoid compiler indicate error */
void vApplication*Hook( TaskHandle_t xTask, char *pcTaskName )
{}
void vApplicationTickHook( void )
{}
void vApplicationIdleHook( void )
{}
void vApplicationMallocFailedHook( void )
{}
添加定义完成后,我们再次编译,
图 2- 9 缺少SystemCoreClock 定义.png
修改 FreeRTOSConfig.h
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( 80000000UL ) //( SystemCoreClock )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
再次编译,发现编译已经能正常通过了:
图 2- 10 添加钩子函数后编译通过.png
至此,FreeRTOS 相应的文件已经都添加进来了,点击编译,能正常编译通过,但是系统还不能工作,因为 FreeRTOS 需要一个定时器作为系统的心跳,cortex-m4 内核提供了一个 systick 系统定时器,做为嵌入式操作系统的心跳,我们参考清华大学出版社出版的《ARM Cortex-M3与Cortex-M4权威指南》和 《Cortex-M3权威指南》来配置 systick 定时器。
配置完 systick 定时器,只是开启了定时以及中断使能,但是中断优先级还没有设置,cortex-m4 内核有一个系统控制块单元 SBC,System Control Block 的 SHR 寄存器可以配置系统中断的优先级:
最终寄存器配置:
unsigned int SysTick_Config(unsigned int ticks)
{
SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */
SCB->SHP[(((uint32_t)-1) & 0xFUL)-4UL] = (uint8_t)((((1UL << 4) - 1UL) << (8U - 4)) & (uint32_t)0xFFUL);
SysTick->VAL = 0UL; /* Load the SysTick Counter Value */
SysTick->CTRL = (1<<2) |
(1<<1) |
(1<<0); /* Enable SysTick IRQ and SysTick Timer */
return (0UL); /* Function successful */
}
配置完 systick ,main.c 也需要修改,FreeRTOS 需要建立任务才能执行:
void systick_init(void)
{
SysTick_Config(80000);
}
int main(void)
{
bsp_init();
systick_init();
/* Create the queue. */
xQueue = xQueueCreate( mainQUEUE_LENGTH, sizeof( unsigned long ) );
xTaskCreate((TaskFunction_t )AppTask,
(const char* )"AppTask",
(uint16_t )512,
(void* )NULL,
(UBaseType_t )5,
(TaskHandle_t* )&AppTask_Handle);
xTaskCreate( UartQueueReceiveTask, "RX", 128, NULL, 2, NULL );
xTaskCreate( UartQueueSendTask, "TX", 128, NULL, 3, NULL );
vTaskStartScheduler();
while(1);
}
在主函数初始化 systick 后,利用 FreeRTOS 系统提供的接口 xTaskCreate 创建名字为 “App” 的任务,点击编译:
图 2- 11 堆栈空间不足.png
从提示中可以看到,错误提示的是 head_4.c 的 bss 段没有空间存放了,这时候看 FreeRTOSConfig.h 里面的配置:
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( 48000000UL ) //( SystemCoreClock )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
堆栈目前设定的大小是 75*1024,太大了,设置小一点 :
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 1
#define configCPU_CLOCK_HZ ( 48000000UL ) //( SystemCoreClock )
#define configTICK_RATE_HZ ( ( TickType_t ) 1000 )
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) 8192 ) //( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW 2
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 1
#define configUSE_APPLICATION_TASK_TAG 0
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
这时候编译就通过了。把程序下载到 EVM 板子上,就可以看到蓝色的小灯不停的闪烁,这说明移植过来的 FreeRTOS 能工作了,到此, 整个移植流程已经完成了。
参考文献
《ARM Cortex-M3与Cortex-M4权威指南》
《CM3权威指南》
代码路径:
链接: https://pan.baidu.com/s/1O45iXaZ1RMdszz1_Y3NiOA 提取码: xevj
作者:Depthkernelcore
链接:https://www.jianshu.com/p/d4c53f63c686
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
上一篇: MongoDB4.0搭建分布式集群