本帖最后由 andeyqi 于 2023-4-8 20:34 编辑
从NXP 官网下载的SDK 包是没找到RTOS 的示例程序,之前已经习惯于了使用RTOS 开发的方式,所以决定移植个FreeRTOS系统至LPC845-BRK 开发板,FreeRTOS的移植适配网上的教程也比较多,理论上只要把FreeRTOS 的系统文件,内存管理,架构相关适配文件,及FreeRTOS 的配置文件适配好基本就完成了移植适配,从官网下载最新的FreeRTOS源码(FreeRTOSv202212.01)开始我们的主题。
1.FreeRTOS 代码提取
1.1 操作系统相关的文件- FreeRTOS\Source\
- |-- croutine.c
- |-- event_groups.c
- |-- list.c
- |-- queue.c
- |-- readme.txt
- |-- stream_buffer.c
- |-- tasks.c
- `-- timers.c
- |-- include
- | |-- FreeRTOS.h
- | |-- StackMacros.h
- | |-- atomic.h
- | |-- croutine.h
- | |-- deprecated_definitions.h
- | |-- event_groups.h
- | |-- list.h
- | |-- message_buffer.h
- | |-- mpu_prototypes.h
- | |-- mpu_wrappers.h
- | |-- portable.h
- | |-- projdefs.h
- | |-- queue.h
- | |-- semphr.h
- | |-- stack_macros.h
- | |-- stdint.readme
- | |-- stream_buffer.h
- | |-- task.h
- | `-- timers.h
复制代码
1.2 内存管理相关文件
- D:\FREERTOSV202212.01\FREERTOS\SOURCE\PORTABLE\MEMMANG
- heap_1.c
- heap_2.c
- heap_3.c
- heap_4.c
- heap_5.c
- ReadMe.url
复制代码 FreeRTOS 支持了5种内存管理的方式,我们使用的是方式4,将heap_4.c 文件加入编译即可。
1.3 M0 架构依赖的架构相关文件
本次使用的开发环境MCUXpresso IDE 内部使用的工具链是gcc,我们选取M0 下的GCC相关的适配文件。
- D:\FREERTOSV202212.01\FREERTOS\SOURCE\PORTABLE\GCC\ARM_CM0
- port.c
- portmacro.h
复制代码
1.4 FreeRTOS 配置文件
配置文件选取DEMO目录下和LPC845 同架构的CORTEX_M0_LPC1114_LPCXPRESSO 的 FreeRTOSConfig.h 文件使用。
- D:\FREERTOSV202212.01\FREERTOS\DEMO\CORTEX_M0_LPC1114_LPCXPRESSO\RTOSDEMO\SOURCE
- cr_startup_lpc11.c
- FreeRTOSConfig.h
- IntQueueTimer.c
- IntQueueTimer.h
- main-blinky.c
- main-full.c
- main.c
- RegTest.c
复制代码
将上述文件整理下只保留我们需要的加入工程编译,目录结构如下,编译过程中根据编译器的编译提示将源码路径下的.h 加入检索路径,并删除配置文件的hook 相关的配置,将如下配置项修改为0:
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_MALLOC_FAILED_HOOK 0
- D:\WORK\LPC845_WORKSPACE\LPC845BRK\LPC845BREAKOUT_HELLO_WORLD\FREERTOSV202212.01
- │ FreeRTOSConfig.h
- │
- └───Source
- │ croutine.c
- │ event_groups.c
- │ list.c
- │ queue.c
- │ stream_buffer.c
- │ tasks.c
- │ timers.c
- │
- ├───include
- │ atomic.h
- │ croutine.h
- │ deprecated_definitions.h
- │ event_groups.h
- │ FreeRTOS.h
- │ list.h
- │ message_buffer.h
- │ mpu_prototypes.h
- │ mpu_wrappers.h
- │ portable.h
- │ projdefs.h
- │ queue.h
- │ semphr.h
- │ StackMacros.h
- │ stack_macros.h
- │ stdint.readme
- │ stream_buffer.h
- │ task.h
- │ timers.h
- │
- └───portable
- ├───GCC
- │ └───ARM_CM0
- │ port.c
- │ portmacro.h
- │
- └───MemMang
- heap_1.c
- heap_2.c
- heap_3.c
- heap_4.c
- heap_5.c
- ReadMe.url
复制代码
2.下载验证
为了验证系统功能是否正常,我们创建两个任务周期打印log,来验证系统调度是否正常,添加如下代码段;
#define START_TASK_PRIO 2
#define START_STK_SIZE 128
TaskHandle_t StartTask_Handler;
void start_task(void *pvParameters);
#define TASK1_TASK_PRIO 2
#define TASK1_STK_SIZE 128
TaskHandle_t Task1Task_Handler;
void start_task1(void *pvParameters);
#define SHELL_TASK_PRIO 2
#define SHELL_STK_SIZE 256
TaskHandle_t ShellTask_Handler;
void start_task(void *pvParameters)
{
while(1)
{
PRINTF("task1 .\r\n");
vTaskDelay(500);
}
}
void start_task1(void *pvParameters)
{
while(1)
{
PRINTF("task2 .\r\n");
vTaskDelay(1000);
}
}
main()
{
xTaskCreate((TaskFunction_t )start_task,
(const char* )"task1",
(uint16_t )START_STK_SIZE,
(void* )NULL,
(UBaseType_t )START_TASK_PRIO,
(TaskHandle_t* )&StartTask_Handler);
xTaskCreate((TaskFunction_t )start_task1,
(const char* )"task2",
(uint16_t )TASK1_STK_SIZE,
(void* )NULL,
(UBaseType_t )TASK1_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
xTaskCreate((TaskFunction_t )littleshell_main_entry,
(const char* )"shell",
(uint16_t )SHELL_STK_SIZE,
(void* )NULL,
(UBaseType_t )SHELL_TASK_PRIO,
(TaskHandle_t* )&Task1Task_Handler);
vTaskStartScheduler();
}
同时把之前的shell(【LPC845-BRK板卡试用申请】(二)shell 移植适配)也作为个任务启动。
运行后log 如下:
- [2023-04-05 13:10:07.239] #
- [2023-04-05 13:10:07.385] #
- [2023-04-05 13:10:07.552] #task1 .
- [2023-04-05 13:10:08.099] task1 .
- [2023-04-05 13:10:08.102] task2 .
- [2023-04-05 13:10:08.596] task1 .
- [2023-04-05 13:10:09.092] task1 .
- [2023-04-05 13:10:09.099] task2 .
复制代码 从log 看 两个task1 log 之间的间隔为500ms ,task2 log 之间时间间隔为1000ms, 和预期的设计是保持一致的,shell 也可以正常响应,说明系统的任务调度已经正常调度了。
MCUXpress IDE 的RTOS 插件是支持FreeRTOS,debug 时能看到当前的任务信息及堆栈使用率信息,可以用于帮助我们评估任务栈分配的是否合理。
=================代码如下=================
|