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

基于S32K144 移植 FreeRTOS 10.1.1相关推荐

  1. 基于STM32F103移植FreeRTOS教程

    前言 本教程只针对移植实操,关于理论部分请另行百度学习. 本教程移植实操基于正点原子源码.教程手册进程移植. 移植实操 1.将正点原子跑马灯程序源码复制一份,添加一个文件夹对FreeRTOS源码进行管 ...

  2. 基于stm32c8t6移植FreeRTOS问题汇总

    1.在移植该操作系统最重要的一个文件便是FreeRTOSConfig.h,像ZET6这种大容量的板子所采用得堆栈大小一般来说会是20*1024,而在c8t6这块最小系统板的flash128k,堆栈大小 ...

  3. 基于STM32F767的FreeRTOS的移植

    (一)FreeRTOS简介 1.1 什么是FreeRTOS? FreeRTOS是一个免费的RTOS类系统.RTOS不是指某一个确定的系统,而是指一类系统.例如UCOS.RTX.RT-Thread等. ...

  4. STM32F4基础工程移植FreeRTOS

    本篇目标:基于上一篇的基础工程(stm32f4_first_demo)上,移植freertos,建立移植工程(stm32f4_freertos). 资料准备: Freertos源文件 最后工程:项目工 ...

  5. 飞思卡尔 k60/k64 移植FreeRTOS+USB

            每年七八月份是智能车大赛的比赛时间,前段时间,学校车队的学弟问我嵌入式系统的问题,于是笔者拿起多年未碰的K60/K64芯片,搭建了一个FreeRTOS+USB的系统框架.文章结尾提供源 ...

  6. Esp8266进阶之路16 esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。(附带固件)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  7. 树莓派 pico 移植 FreeRTOS

    文章目录 1.FreeRTOS 2.创建工程 3.移植FreeRTOS 4.编写代码 1.FreeRTOS FreeRTOS 是一个迷你的实时操作系统内核.作为一个轻量级的操作系统,功能包括:任务管理 ...

  8. STM32F4移植FreeRTOS V10.3.1

                                                                            STM32F429移植FreeRTOS 一.环境 Win ...

  9. FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

     上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建 ...

最新文章

  1. bzoj 2946 [Poi2000]公共串——后缀自动机
  2. 暑期集训5:并查集 线段树 练习题F:  HDU - 1166 ​​​​​​​
  3. 移动数据分析服务使用教程
  4. 一句话就能让AI找到3A游戏Bug?准确率达86%,Demo在线可玩
  5. Python调用MongoDB使用心得
  6. sed 删除windows下的CR/LF
  7. B. Trouble Sort Codeforces Round #648 (Div. 2)
  8. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
  9. 怎样在MyEclipse中连接Oracle数据库
  10. Linux进程间通信——消息队列
  11. 2018 n1ctf easy_hard_php 攻击流程图
  12. Rust: 如何交换Vec类型中数据的位置?
  13. MATHEMATICS FOR MACHINE LEARNING部分翻译
  14. Vue+elementUI导出xlsl表格,支持复杂表头,自动合拼单元格。xlsx+file-saver插件
  15. DTIM间隔在组播和节电方面的综合考虑
  16. (翻译)用户友好的表格的9种设计技巧
  17. eclipse背景设置什么颜色缓解眼睛疲劳
  18. NoSuchMethodError 错误——包冲突解决办法
  19. html点击弹出登录注册表单提交代码
  20. k8s-2:nfs搭建

热门文章

  1. win10 安装.net3.5失败,错误代码0x800f0922
  2. mysql执行两条update语句
  3. Shopee物流信息出现问题要怎么查询,你知道吗?
  4. 平方矩阵(回字形矩阵)
  5. 【走进php内核】之 循环结构(while,do while,for,foreach)
  6. PHP for循环的写法和示例
  7. Python爬虫01—请求模块
  8. 用Email免费发送传真
  9. 旋风备忘录0.10软件介绍
  10. 合格前端系列第十一弹-初探 Nuxt.js 秘密花园