返回列表 发新帖我要提问本帖赏金: 80.00元(功能说明)

[APM32F4] 基于APM32F4的TencentOS 适配

[复制链接]
10485|12
 楼主| kai迪皮 发表于 2023-9-4 17:44 | 显示全部楼层 |阅读模式
#申请原创#  @21小跑堂

1 前言

最近在了解TencentOS的特性,据了解它的一些特点:

1. 资源占用极少
2. 高效功耗管理框架
3. 自动移植工具
4. 最后一屏调试工具
5. 安全分级方案

它的官网这里:https://cloud.tencent.com/product/tos-tiny

正好我手上有极海家的APM32F407IGMINI板卡,我便计划基于这块板卡移植TencentOS来看看。

本文将记录移植的过程,也请各位大神多多斧正。

2 APM32F4 源码准备

我们去极海官网下载APM32F4的SDK包:https://geehy.com/uploads/tool/APM32F4xx_SDK_V1.4.zip

打开SDK包我们找一个“顺眼的”demo作为我们的基础,以移植TencentOS,对就是你了“SysTick”例程。

image-20230831211119326.png

本次我计划在MDK上实现APM32F4的TencentOS适配,所以我将选择“SysTick”例程的MDK工程。为了不和原工程混淆,我把“SysTick_TimeBase”复制至\Examples\RTOS目录下:
image-20230831211739939.png

把“SysTick_TimeBase”名字改为“TencentOS”。

3 TencentOS源码获取

我们去TencentOS的Github仓库下载其最新的源码:https://github.com/OpenAtomFoundation/TencentOS-tiny

关于TencentOS的源码我们比较关系的重要内容有:

Snipaste_2023-09-04_17-35-06.png


由于我手上的APM32F4 尚未被TencentOS支持,所以我们在“board”文件夹中未能找到我们需要的东西,但可做参考。

本次考虑的是能够使得APM32F407正常运行TencentOS,所以我们更关心的是TencentOS tiny 适配的 IP 核架构、TencentOS tiny 内核源码这两部分的内容。

下面我们复将TencentOS源码复制或解压至“APM32F4xx_SDK_V1.4\Middlewares”文件夹中。

image-20230831212742775.png

至此我们完成了源码的获取工作,接下来我们将进入MDK的工程设置进行一步步的把TencentOS移植。

4 移植TencentOS至APM32F407

打开我们刚刚在第2节中准备的工程:

image-20230831213405589.png
我们将在该工程上进行修改。

4.1 TencentOS 源文件包含

首先我们先创建用于保存TencentOS的文件目录结构:

image-20230831213650946.png

分别是:

1. TencentOS/arch

   用于存放arch 平台代码。

2. TencentOS/kemel

   用于存放TencentOS内核源码,

3. TencentOS/cmsis_os

   用于存放cmsis os 源码,

4.2 TencentOS 头文件路径包含

完成源文件包含后我们将所需的头文件包含进我们的工程。

image-20230831215105563.png

4.3 复制tos_config.h

我们将和APM32F4 相同架构的STM32L431demo下的tos_config.h(APM32F4xx_SDK_V1.4\Middlewares\TencentOS-tiny\board\BearPi_STM32L431RC\TOS-CONFIG)文件复制到我们的目录下:

image-20230831215044918.png

4.4 修改源码

4.4.1 修改tos_config.h的头文件包含为“apm32f4xx.h”

image-20230831215502381.png

4.4.2 注释PendSV_Handler

注释掉apm32f4xx_int.c里面的PendSV_Handler函数,该函数将由TencentOS接管。

image-20230831215618599.png

4.4.3 修改SysTick_Handler

TencentOS 需要SysTick做为时基,在“apm32f4xx_int.c”的头部增加“tos_k.h”引用。

image-20230904165735819.png

然后修改SysTick_Handler函数如下:

  1. void SysTick_Handler(void)
  2. {
  3. //    TimingDelay_Decrement();
  4.    
  5.     if (tos_knl_is_running())
  6.     {
  7.         tos_knl_irq_enter();
  8.         tos_tick_handler();
  9.         tos_knl_irq_leave();
  10.     }
  11.    
  12. }



4.4.4 修改main.c

在 main.c 中添加 TencentOS tiny 头文件,编写任务函数:

image-20230831215905739.png

任务函数编写可以参考官方提供的demo:

  1. //task1
  2. #define TASK1_STK_SIZE       256
  3. void task1(void *pdata);
  4. osThreadDef(task1, osPriorityNormal, 1, TASK1_STK_SIZE);

  5. //task2
  6. #define TASK2_STK_SIZE       256
  7. void task2(void *pdata);
  8. osThreadDef(task2, osPriorityNormal, 1, TASK2_STK_SIZE);

  9. void task1(void *pdata)
  10. {
  11.     int count = 1;
  12.     while (1)
  13.     {
  14.         printf("\r\nHello world!\r\n###This is task1 ,count is %d \r\n", count++);
  15.         APM_MINI_LEDToggle(LED2);
  16.         osDelay(2000);
  17.     }
  18. }
  19. void task2(void *pdata)
  20. {
  21.     int count = 1;
  22.     while (1)
  23.     {
  24.         printf("\r\nHello TencentOS !\r\n***This is task2 ,count is %d \r\n", count++);
  25.         APM_MINI_LEDToggle(LED3);
  26.         osDelay(1000);
  27.     }
  28. }


然后将main函数修改如下:

  1. int main(void)
  2. {
  3.     USART_Config_T usartConfigStruct;

  4.     usartConfigStruct.baudRate = 115200;
  5.     usartConfigStruct.hardwareFlow = USART_HARDWARE_FLOW_NONE;
  6.     usartConfigStruct.mode = USART_MODE_TX;
  7.     usartConfigStruct.parity = USART_PARITY_NONE;
  8.     usartConfigStruct.stopBits = USART_STOP_BIT_1;
  9.     usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  10.     APM_MINI_COMInit(COM1, &usartConfigStruct);

  11.     APM_MINI_LEDInit(LED2);
  12.     APM_MINI_LEDInit(LED3);

  13.     osKernelInitialize();//TOS Tiny kernel initialize
  14.     osThreadCreate (osThread(task1),NULL);//Create task1
  15.     osThreadCreate(osThread(task2),NULL);//Create task2
  16.     osKernelStart ();//Start Tos Tiny

  17.     while (1)
  18.     {
  19.     }
  20. }



至此我们完成了代码的编写工作。

5 编译下载

完成代码的编写工作后,我们编译工程:

image-20230904171849221.png

进行下载(我使用的是jlink)。然后使用串口线连接MINI板,打开串口助手可以看到两个任务可以正常打印,LED按照各自的延时时间正常闪烁。

image-20230904172053582.png

至此,基于APM32F4的TencentOS 适配工作完成。你也来试试看吧。

这里是工程 APM32F4xx_SDK_V1.4_TencentOS_tiny.zip (1.57 MB, 下载次数: 6) (仅保留源码)。


打赏榜单

21小跑堂 打赏了 80.00 元 2023-09-08
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

赞,来学习一下!  发表于 2023-10-12 11:49
@21小跑堂 :感谢资持,嘻嘻  发表于 2023-9-8 10:11
保姆级教程,逐步将TencentOS适配入APM32F4平台。过程详细,条理清晰。  发表于 2023-9-8 10:02
llljh 发表于 2023-9-5 22:50 | 显示全部楼层
图文并茂,太详细了

评论

对您有帮助的话,点个赞吧~  发表于 2023-9-7 18:03
forgot 发表于 2023-9-7 08:05 | 显示全部楼层
非常详细,楼主优秀

评论

谢谢夸奖,欢迎一起交流  发表于 2023-9-7 10:04
chenqianqian 发表于 2023-9-7 08:35 来自手机 | 显示全部楼层
腾讯的嵌入式系统?

评论

是的  发表于 2023-9-7 10:04
chenjun89 发表于 2023-10-17 19:37 来自手机 | 显示全部楼层
用着OS的多吗?阿里也搞了个嵌入式OS。
daichaodai 发表于 2023-10-17 23:19 来自手机 | 显示全部楼层
这个是腾讯的RTOS系统吗?
 楼主| kai迪皮 发表于 2023-10-18 16:33 | 显示全部楼层
daichaodai 发表于 2023-10-17 23:19
这个是腾讯的RTOS系统吗?

是腾讯家的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

43

主题

292

帖子

11

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