N32G43x_L40x_L43x系列芯片FreeRTOS工程移植简述
N32G43x_L40x_L43x系列芯片FreeRTOS工程移植简述
前言
提示:这里可以添加本文要记录的大概内容:
本文档主要介绍 N32G43x_L40x_L43x 系列芯片(以下简称 N32G43x)移植 FreeRTOS 的示例,以及提供相应例程。
提示:以下是本篇文章正文内容,下面案例可供参考
一、FreeRTOS 源码获取
移植前需要上 FreeRTOS 的官网去获取相应源码:www.freertos.org。这里用的版本是 FreeRTOSv202012.00。
二、工程移植
先准备一个基础工程,然后在基础工程中添加相应文件
1.添加 FreeRTOS 源码

2、将 portable 文件夹中多余的子文件夹去掉,如下:

关于 MemMang 文件中的几个 heap.c 文件,分别是 5 种不同的内存管理方式,这 5 个文件都可以用来作为 FreeRTOS 的内存管理文件,只是它们实现的原理不同,各有利弊。有兴趣的可以自行学习它们的区别, 这里我们选择 heap_4.c,这也是 FreeRTOS 比较常用的方式。

2.3.2 修改 FreeRTOS 源码

错误说明:缺少 FreeRTOSConfig.h 头文件。
#if defined(__ICCARM__) || defined(__CC_ARM) || defined(__GNUC__)
#include <stdint.h>
extern uint32_t SystemCoreClock;
#endif
修改之后再次编译,如下:

其中 configTOTAL_HEAP_SIZE 的大小是在 FreeRTOSConfig.h 中定义的,如下:
再编译

再编译,至此编译通过。如仍有错误,可自行根据错误类型查找并修改。
2.3.3 修改 NZ_delay.c
1. extern void xPortSysTickHandler(void);2. void SysTick_Handler(void)3. {4. if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)// 系统已经运行5. {6. xPortSysTickHandler();7. }8. }
1. /**2. * @brief 初始化延迟函数3. * @note SYSTICK 的时钟固定为 HCLK 时钟4. */5. static u32 fac_us = 0; //us 延时倍乘数6. static u32 fac_ms = 0; //ms 延时倍乘数7. void NZ_Delay_init(void)8. {9. u32 reload;10.11. SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);// 选择外部时钟 HCLK12. fac_us = (SystemCoreClock / (1000000)); // 为系统时钟13.14. reload = (SystemCoreClock / 1000000); // 每秒钟的计数次数 单位为 M15. reload *= (1000000 / configTICK_RATE_HZ); //根据 configTICK_RATE_HZ 设定溢出时间16. fac_ms = (1000 / configTICK_RATE_HZ); // 代表 OS 可以延时的最少单位17.18. SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; // 开启 SYSTICK 中断19. SysTick->LOAD=reload; // 每 1/configTICK_RATE_HZ 断一次20. SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; // 开启 SYSTICK21. }
1. /**2. * @brief us 级别延时函数3. * @param nus:需要延时的微秒数4. * @note 如果延时的时间到了毫秒级别,则用 NZ_Delay_xms 实现5. */6. void NZ_Delay_us(u32 nus)7. {8. u32 ticks;9. u32 told,tnow,tcnt = 0;10. u32 reload = SysTick->LOAD; //LOAD 的值11. ticks = nus*fac_us; // 需要的节拍数12. told = SysTick->VAL; // 刚进入时的计数器值13. while(1)14. {15. tnow = SysTick->VAL;16. if(tnow != told)17. {1318. if(tnow<told) // 这里注意一下 SYSTICK 是一个递减的计数器就可以了19. tcnt += told-tnow;20. else21. tcnt += reload-tnow+told;22.23. told = tnow;24. if(tcnt>= ticks) // 时间超过 / 等于要延迟的时间, 则退出25. break;26. }27. };28. }
1. void NZ_Delay_ms(u32 nms)2. {3. if(xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED) // 系统已经运行4. {5. if(nms>= fac_ms)//延时的时间大于 OS 的最少时间周期6. {7. vTaskDelay(nms / fac_ms); //FreeRTOS 延时8. }9.10. nms %= fac_ms;//OS 已经无法提供这么小的延时了, 采用普通方式延时11. }12.NZ_Delay_us((u32)(nms*1000)); // 普通方式延时13. }14.15. /**16. * @brief ms 级别延时函数17. * @param nms:需要延时的微秒数18. */19. void NZ_Delay_xms(u32 nms)20. {21.u32 i;22.for(i=0;i<nms;i++) NZ_Delay_us(1000);23. }


总结
以上就是工程移植的指导内容,后续还需要工程验证,更详细的内容可与我们联络获得资料。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)