完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、移植前的准备
1. 引言 因为项目的原因需要将原有的标准库工程升级为基于TencentOS-tiny的RTOS工程,所以花费一点时间记录移植过程,提供一份向基于STM32标准库的老工程中移植TencentOS-tiny的思路。 2. 移植条件 移植 TencentOS-tiny 需要确保 Systick 可以正常工作: ① Systick用于向TencentOS-tiny提供时钟节拍支持,通常为1ms一次中断; ② Systick属于内核外设,在TencentOS-tiny中会自动配置,无需用户手动配置。 ③ Systick正常延时,则证明时钟配置正确。 另外,可以再配置一个串口用于打印日志,并将printf重定向到串口,如果不想配置也可以使用LED测试系统是否正常运行。 本文所使用的是STM32F407探索者开发板,固件库版本为1.8.0,开发工具为Keil-MDK。 二、移植过程 1. 下载TencentOS-tiny源码 2. 复制TencentOS-tiny文件 在原有的裸机工程下新建一个文件夹,用于存放TencentOS-tiny相关的文件: 移植TencentOS-tiny内核只需要复制两个文件夹:
3. 添加TencentOS-tiny文件 向标准库裸机工程中添加TencentOS-tiny相关的文件。 3.1. 创建分组 3.2. 添加CPU架构支持文件 本文中所使用的MCU是STM32F407,属于Cortex-M4内核系列,所以添加以下三个文件:
tos_fault.c是针对TencentOS-tiny硬件故障追踪功能的支持,此功能可以在tos_config.h中配置,如果加入的话,需要将工程中原有的HardFault_Handler屏蔽。3.3. 添加内核源码文件 kernelcore 目录下的所有文件是TencentOS-tiny内核源码实现,将所有文件都添加到到MDK工程中: 3.4. 添加头文件路径 将以上c文件所使用的头文件路径都添加到MDK中: 4. 添加TencentOS-tiny配置文件 TencentOS-tiny内核中有非常丰富的功能,可以针对不同的应用进行裁剪,配置文件为tos_config.h。 在项目中新建一个文件夹用于存放TencentOS-tiny配置文件: 从TencentOS-tiny源码中的board目录下找到STM32F4类型开发板的支持,从其中复制一份配置文件: 复制过来该文件后,为了方便在工程中随时修改,创建 tos/config 分组,将其添加到MDK工程中,如图: 再将该文件的路径添加到头文件路径中,使编译器可以找到: 5. 修改代码进行适配 5.1. 屏蔽原有PendSV中断处理函数 TencentOS-tiny内核中已经对PendSV异常进行了处理,在PendSV中断进行任务上下文切换,所以需要屏蔽工程中原有的PendSV中断处理函数。 5.2. 提供Systick中断支持 TencentOS-tiny内核需要Systick提供时钟节拍,在原有的中断文件stm32f4xx_it.h中进行修改。 首先包含TencentOS-tiny内核的头文件: 接着编写Systick中断处理程序: if (tos_knl_is_running()) { tos_knl_irq_enter(); tos_tick_handler(); tos_knl_irq_leave(); } 5.3. 修改配置文件 TencentOS-tiny中需要注意的配置项有: ① 针对Systick时钟节拍的配置项: /* 配置每s中多少个tick数,即Systick每s产生多少次中断 */ #define TOS_CFG_CPU_TICK_PER_SECOND 1000u /* CPU主频 */ #define TOS_CFG_CPU_CLOCK (SystemCoreClock) ② 硬件故障追踪功能(之前未添加对应的支持文件,所以不开启): #define TOS_CFG_FAULT_BACKTRACE_EN 0u 5.4. 开启C99支持 此时,移植完成,编译无误。 三、测试系统运行 以下测试代码都在main.c中编写。 ① 包含TencentOS-tiny头文件: #include "tos_k.h" ② 创建两个任务,以测试系统是否正常运行: k_task_t task1; k_task_t task2; k_stack_t task1_stack[256]; k_stack_t task2_stack[256]; void task1_entry(void *args) { while (1) { printf("task1 is running...rn"); tos_task_delay(1000); } } void task2_entry(void *args) { while (1) { printf("task2 is running...rn"); tos_task_delay(1000); } } ③ 初始化串口、初始化TencentOS-tiny内核、创建两个测试任务、启动内核: int main() { /* Init LED */ led_init(); /* Init Usart1 */ USART1_Init(); /* Init TencentOS-tiny Kernel */ tos_knl_init(); /* Create task1 and task2 */ tos_task_create(&task1, "task1", task1_entry, NULL, 2, task1_stack, 256, 10); tos_task_create(&task2, "task2", task2_entry, NULL, 3, task2_stack, 256, 10); /* Start TencentOS-tiny Kernel */ tos_knl_start(); /* Main Loop */ while (1) { printf("Error!rn"); Delay_ms(1000); } } ④ 编译、下载到开发板中,在串口助手中查看运行结果,系统正常运行,移植成功: |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
2159 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1835 浏览 1 评论
1321 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
864 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
2204 浏览 2 评论
2110浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
1020浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
391浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
721浏览 3评论
710浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-4-9 03:18 , Processed in 0.840362 second(s), Total 44, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191