本帖最后由 dirty123 于 2024-4-23 23:19 编辑
本篇讲述N32G430C8L7_STB开发板 移植FreeRTOS。有用N32G43X官方移植发现与此开发板MCU库及函数等存在不兼容,这里单独移植。
一.了解与准备
1.芯片资源
MCU N32G430C8L7内部资源RAM:16KB,Flash:64KB,ARM Cortex™-M4F核,此是移植硬件基础。基于芯片资源在移植是注意裁剪。
2.FreeRTOS源码包
获取(1)官 网 : http://www.freertos.org/ (2)代 码 托 管 网 站 :https://sourceforge.net/projects/freertos/files/FreeRTOS/
二.移植,代码修改,创建demo任务
这里在前面串口打印逻辑工程上做移植,先把工程文件独立出来,调整路径后编译通过。
1.工程添加FreeRTOS源码
将FreeRTOS源码放到工程文件夹下,Keil添加源文件及路径,这里露出系统配置源文件FreeRTOSConfig.h。
图1:FreeRTOS源码添加
2.中断文件n32g430_it.c屏蔽SVC_Handler,PendSV_Handler ,它们在系统port.c定义了。修改SysTick_Handler在函数里添加如下
void SysTick_Handler(void)
{
if(xTaskGetSchedulerState()!=taskSCHEDULER_NOT_STARTED)//系统已经运行
{
xPortSysTickHandler();
}
}
3.在FreeRTOSConfig.h裁剪配置
前面讲了MCU RAM 16KB,这里configTOTAL_HEAP_SIZE定义为8KB,其他地方可按需调整,这里注意下SystemClockFrequency为系统时钟频率
图2:裁剪配置
4.创建定时器初始化及延时函数,非必须项。实现在sys_tick.c,这里不细讲。
5.创建任务。在任务里间隔1s打印串口信息
xReturn=xTaskCreate((TaskFunction_t )demo_task, //任务函数
(const char* )"demo_task", //任务名称
(uint16_t )Demo_STK_SIZE, //任务堆栈大小
(void* )NULL, //传递给任务函数的参数
(UBaseType_t )Demo_TASK_PRIO, //任务优先级
(TaskHandle_t* )&DemoTask_Handler); //任务句柄
if(xReturn==pdPASS)
{
printf("\n\rCreate demo_task OK\n\r");
vTaskStartScheduler(); //开启任务调度
}
else
{
printf("\n\rCreate demo_task Fail\n\r");
}
void demo_task(void *pvParameters)
{
while(1)
{
printf("\n Run demo_task\n\r");
vTaskDelay(1000);
}
}
三.编译烧录运行
烧录后串口日志如下,可以看到系统正常运行,移植成功。
图3:任务日志
至此,完成N32G430C8L7_STB开发板FreeRTOS移植。这里分享代码见附件,供大家参考学习。
|