[综合信息] HC32F003移植FreeRTOS

[复制链接]
 楼主| 八层楼 发表于 2021-8-1 15:51 | 显示全部楼层 |阅读模式
前期准备

首先需要准备移植的相关华大MCU外设固件库以及FreeRTOS

  • 华大MCU处理器的固件外设例程官网下载


watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
2.FreeRTOS官方固件下载
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
 楼主| 八层楼 发表于 2021-8-1 15:52 | 显示全部楼层
开始移植

1. 为了方便移植,直接利用华大官方固件库的GPIO输出的MDK例程工程进行移植,找到华大固件库的GPIO例程MDK工程,贴图如下
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg


 楼主| 八层楼 发表于 2021-8-1 15:53 | 显示全部楼层
2. 打开华大例程的MDK工程,贴图是代码目录结构
20210607230956797.png
common目录是系统启动汇编代码、中断服务函数代码、以及系统初始化相关代码
source是用户代码目录,存放例程的main.c
driver是华大官方提供的外设库函数目录
 楼主| 八层楼 发表于 2021-8-1 15:53 | 显示全部楼层
3. 打开FreeRTOS的内核源码,贴图如下:
22953610652d380af3.png
图中Demo目录是FreeRTOS官方提供的一些处理器移植例子,当然是没有HC32F003,否则我们也就不用干了;License目录是一些官方license文件;Source则是内核源码,因此需要该部分,copy该部分到华大固件库的目录下,同时为了更好理解目录含义,把目录重命名为FreeRTOS_Source:

8475610652dbc67d5.png

 楼主| 八层楼 发表于 2021-8-1 15:54 | 显示全部楼层
4、在MDK工程中,新建group FreeRTOS并添加相关内核源码,贴图如下:
添加平台无关内核源码部分: 369056106530f64866.png
添加平台强相关的部分:
这个port.c文件非常重要,是内核任务调度相关的实现部分,有很多采用汇编语言实现的,因此不同的硬件CPU架构之间差异较大。而HC32F003是ARM-CM0+的内核,ARM-CM0与CM0+汇编没有差异,因此我们选择ARM-CM0即可
1864761065325ab1a1.png
添加内存管理的实现代码:
Heap1-Heap4有一定的差异,这里不展开,采用Heap4.c作为内存堆栈管理
701226106533647871.png

最后添加相应的头文件包含目录:
3986106533e19058.png

 楼主| 八层楼 发表于 2021-8-1 15:55 | 显示全部楼层
开始编译,解决编译错误

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
提示找不到FreeRTOSConfig.h,此文件是内核配置,该文件通过定义不同的宏对内核进行裁剪。为了图方便,采用了FreeRTOS的官方的STM32F103 DEMO工程的配置文件,将其copy至华大例程目录下
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
再次编译成功。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg


 楼主| 八层楼 发表于 2021-8-1 15:56 | 显示全部楼层
这里提前说一句,此处的编译成功并不代表移植成功了。打开port.c
2542161065379152ce.png
这里定义的三个函数是内核定义三个中断函数,分别用来进行任务切换和操作系统内核的定时心跳使用,而HC32F003的汇编启动文件中断向量并非这三个函数,因此我们需要将启动文件的中断服务函数改为FreeRTOS定义的这三个函数
578096106537fdc174.png
改为FreeRTOS内核定义的中断服务函数
457376106538a36b66.png

5447561065391874d7.png
再次编译通过!

67028610653985cd21.png

 楼主| 八层楼 发表于 2021-8-1 15:57 | 显示全部楼层
编写定时任务,测试移植

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
任务比较简单,start_task用于创建task1_task, 而task1_task是定时任务,闪烁LED。
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg


 楼主| 八层楼 发表于 2021-8-1 15:58 | 显示全部楼层
主函数初始化完成后,开始创建任务以及任务调度。
开始编译,报错,内存不足
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
发现freeRTOSConfig文件的heap大小配置太大,进行修改,并同时修改CPU时钟频率
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
修改后:
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
 楼主| 八层楼 发表于 2021-8-1 15:58 | 显示全部楼层
上板测试

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzE4OTUzOTE3,size_16,color_FFFFFF,t_70.jpg
LED灯每1s闪烁一次,移植成功


您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

4338

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

113

主题

4338

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部