欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于S32K144 移植 FreeRTOS 10.1.1

程序员文章站 2022-03-28 20:22:33
...

转自:https://www.jianshu.com/p/d4c53f63c686

内容目录

一、FreeRTOS 源码的获取
二、移植 FreeRTOS
参考文献

一、FreeRTOS 源码的获取

基于S32K144 移植 FreeRTOS 10.1.1

图 1-1 FreeRTOS 官方网站.png

点击左边的【Download Source】,选择相应的方式下载源码:

 

基于S32K144 移植 FreeRTOS 10.1.1

图 1- 2 FreeRTOS 下载.png

【Latest News】显示的是当前 FreeRTOS 的版本信息和支持的一些芯片信息,点击【Download Source Code and Projects】后,稍等一会就会自动下载官方的 .exe 文件:FreeRTOSv10.1.1.exe,双击运行,选择安装目录,等待完成,目录结构如下:

基于S32K144 移植 FreeRTOS 10.1.1

图 1- 3 FreeRTOS 目录结构.png

① FreeRTOS : 主要存放的是 OS 的源码和 DEMO;
② FreeRTOS-Plus : 主要存放的是 OS 的一些扩展功能,比如 TCP/IP;
我们目前要使用的是 FreeRTOS 目录的内容:

基于S32K144 移植 FreeRTOS 10.1.1

图 1- 4 FreeRTOS 目录结构.png

① DEMO :FreeRTOS 给各个厂商开发的例程文件;
② License : 里面存放了 license 说明文档;
③ Source : 内核代码文件,移植主要用到的文件都在这里面;

基于S32K144 移植 FreeRTOS 10.1.1

图 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 文件夹复制过来

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 1 src 文件夹.png

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 2 include 文件夹.png

基于S32K144 移植 FreeRTOS 10.1.1

图 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 文件夹

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 4 工程组结构.png

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 5 设置 FreeRTOS 头文件路径.png

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 6 添加 FreeRTOS 头文件.png

先进行一次编译,发现报错:

基于S32K144 移植 FreeRTOS 10.1.1

图 2- 7 首次编译报错.png

从报错的内容看,都是缺少定义后缀为 Hook 的函数,这些函数都是钩子函数,我们在提示错误的源文件里面都能找到相应的函数声明:

基于S32K144 移植 FreeRTOS 10.1.1

图 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 )
{}

添加定义完成后,我们再次编译,

基于S32K144 移植 FreeRTOS 10.1.1

图 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

再次编译,发现编译已经能正常通过了:

基于S32K144 移植 FreeRTOS 10.1.1

图 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” 的任务,点击编译:

基于S32K144 移植 FreeRTOS 10.1.1

图 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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关标签: 工作