基于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 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相关推荐
- 基于STM32F103移植FreeRTOS教程
前言 本教程只针对移植实操,关于理论部分请另行百度学习. 本教程移植实操基于正点原子源码.教程手册进程移植. 移植实操 1.将正点原子跑马灯程序源码复制一份,添加一个文件夹对FreeRTOS源码进行管 ...
- 基于stm32c8t6移植FreeRTOS问题汇总
1.在移植该操作系统最重要的一个文件便是FreeRTOSConfig.h,像ZET6这种大容量的板子所采用得堆栈大小一般来说会是20*1024,而在c8t6这块最小系统板的flash128k,堆栈大小 ...
- 基于STM32F767的FreeRTOS的移植
(一)FreeRTOS简介 1.1 什么是FreeRTOS? FreeRTOS是一个免费的RTOS类系统.RTOS不是指某一个确定的系统,而是指一类系统.例如UCOS.RTX.RT-Thread等. ...
- STM32F4基础工程移植FreeRTOS
本篇目标:基于上一篇的基础工程(stm32f4_first_demo)上,移植freertos,建立移植工程(stm32f4_freertos). 资料准备: Freertos源文件 最后工程:项目工 ...
- 飞思卡尔 k60/k64 移植FreeRTOS+USB
每年七八月份是智能车大赛的比赛时间,前段时间,学校车队的学弟问我嵌入式系统的问题,于是笔者拿起多年未碰的K60/K64芯片,搭建了一个FreeRTOS+USB的系统框架.文章结尾提供源 ...
- Esp8266进阶之路16 esp8266的 基于Nonos移植红外线H1838,实现红外遥控器配网,远程控制一盏灯。(附带固件)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- 树莓派 pico 移植 FreeRTOS
文章目录 1.FreeRTOS 2.创建工程 3.移植FreeRTOS 4.编写代码 1.FreeRTOS FreeRTOS 是一个迷你的实时操作系统内核.作为一个轻量级的操作系统,功能包括:任务管理 ...
- STM32F4移植FreeRTOS V10.3.1
STM32F429移植FreeRTOS 一.环境 Win ...
- FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS
上一次,我们简单的测试了FreeRTOS的基于IAR EWARMv6.4和STM32F103VET6平台的Demo,对其有了一个基本认识.接下来我们开始自己移植FreeRTOS的过程. 1.创建 ...
最新文章
- bzoj 2946 [Poi2000]公共串——后缀自动机
- 暑期集训5:并查集 线段树 练习题F: HDU - 1166 ​​​​​​​
- 移动数据分析服务使用教程
- 一句话就能让AI找到3A游戏Bug?准确率达86%,Demo在线可玩
- Python调用MongoDB使用心得
- sed 删除windows下的CR/LF
- B. Trouble Sort Codeforces Round #648 (Div. 2)
- android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
- 怎样在MyEclipse中连接Oracle数据库
- Linux进程间通信——消息队列
- 2018 n1ctf easy_hard_php 攻击流程图
- Rust: 如何交换Vec类型中数据的位置?
- MATHEMATICS FOR MACHINE LEARNING部分翻译
- Vue+elementUI导出xlsl表格,支持复杂表头,自动合拼单元格。xlsx+file-saver插件
- DTIM间隔在组播和节电方面的综合考虑
- (翻译)用户友好的表格的9种设计技巧
- eclipse背景设置什么颜色缓解眼睛疲劳
- NoSuchMethodError 错误——包冲突解决办法
- html点击弹出登录注册表单提交代码
- k8s-2:nfs搭建