[应用相关] N32G401移植TobudOS

[复制链接]
 楼主| lulugl 发表于 2024-2-20 21:26 | 显示全部楼层 |阅读模式
#申请原创# #有奖活动# @21小跑堂 【TobudOS简介】
TobudOS是开放原子开源基金会孵化的,面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,安全可靠等特点,可有效提升物联网终端产品开发效率,助力物联网终端设备及业务快速接入云上服务和应用。
项目特点:
(1).小体积
最小内核:RAM 0.6KB,ROM 1.8KB 典型 LoraWAN 及传感器应用:RAM 3.3KB,ROM 12KB
(2).低功耗
休眠最低功耗低至 2uA 支持外设功耗管理框架
(3).丰富的 IoT 组件
集成主流 IoT 协议栈 多种通信模组SAL层适配框架; 支持 OTA 升级 提供简单易用端云 API,加速用户业务接入腾讯云
(4).可靠的安全框架
多样化的安全分级方案 均衡安全需求&成本控制
(5).良好的可移植性
内核及IoT组件高度解耦,提供标准适配层 提供自动化移植工具,提升开发效率
(6).便捷的调试手段
提供云化的最后一屏调试功能 故障现场信息自动上传云平台,方便开发人员调试分析

【移植步骤】
1、下载开发包:ftp://download.nationstec
下载后打开,找到Keil的安装包,目录为:\N32G401xx_V1.0.0\6.Software Development Kit
安装pack包,双击后会找到默认的keil包地址,一路next就完成了MDK包的安装。
2、解压SDK包,在pack包的目录下有压缩文件,打开后可以得官方提供的驱动库以及示例工程:
9.png
其的目录比较新,可以把包复制到上几层目录,方例查找。
6、打开示例工程中的printf示例,这个示例帮我们生成了串品打印的工程,我们在这个工程中来实现TobudOS的移植。
7、我打开工程将例程下载到开发板,保存能打印出信息,我这里在串品助手中出现如下信息,说明工程一切正常。
  1. USART Printf Example: retarget the C library printf function to the USART
【ToboudOS移植】
1、我们需要去下载源码,网址为:TobudOS-AtomGit
2、下载好源码后,我们在工程中新建一个os的文件夹,用于存放需要的文件。
3、把源码中的arch、core、osal三个文件夹放到os目录中。

4、同时新建os_config文件夹用于存放配置文件。
5、在MDK工程中新建三个项目组。分别为OS/arch、OS/kernel、OS/config:
8.png
6、添加内核需要的文件到工程中,从keil的工程中我们看到N32G401为arm_M4F内核。
所以我把\os\arch\arm\arm-v7m\cortex-m4\armcc下在的两文件port_c.c 、port_s.S添加进工程。
7.png
同时把\os\arch\arm\arm-v7m\common下面的tos_cpu.c、tos_fault.c添加进arch的分组中:

如果大家要想文件夹内容小,可以把arch下其的文件删掉。
7、添加kernel工程分配,我们把\os\core下面所有的.c都添加kernel分组中。
6.png
同时把\os\osal\cmsis_os,下面的cmsis_os添加进工程。
5.png
8、从官方示例中下载一个config文件到config文件夹里,并把它添加进OS/config工程分组中。 4.png
9、添回文件头文件到工程中,如果下图所示:
3.png
10、打开配置钩选c99.
2.png
11、注释掉n32f401_it.c中的void PendSv_Handler函数,去除重复定义的错误。
12、添加#include "tos_k.h"头文件,并把TobudOS心跳到systick函数中:
  1. void SysTick_Handler(void)
  2. {
  3.        
  4.         if(tos_knl_is_running())
  5.         {
  6.                 tos_knl_irq_enter();
  7.                 tos_tick_handler();
  8.                 tos_knl_irq_leave();
  9.         }
  10. }
13、其配置文件修改如下:
  1. #ifndef _TOS_CONFIG_H_
  2. #define  _TOS_CONFIG_H_

  3. #include "main.h"


  4. #include <stdio.h>

  5. extern uint32_t SystemClockFrequency;

  6. #define TOS_CFG_TASK_PRIO_MAX           10u

  7. #define TOS_CFG_ROUND_ROBIN_EN          1u

  8. #define TOS_CFG_OBJECT_VERIFY_EN        1u

  9. #define TOS_CFG_OBJ_DYNAMIC_CREATE_EN   1u

  10. #define TOS_CFG_EVENT_EN                1u

  11. #define TOS_CFG_MMBLK_EN                1u

  12. #define TOS_CFG_MMHEAP_EN               1u

  13. #define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x500

  14. #define TOS_CFG_MUTEX_EN                1u

  15. #define TOS_CFG_TIMER_EN                1u

  16. #define TOS_CFG_PWR_MGR_EN              0u

  17. #define TOS_CFG_TICKLESS_EN             0u

  18. #define TOS_CFG_SEM_EN                  1u

  19. #define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN      1u

  20. #define TOS_CFG_FAULT_BACKTRACE_EN      0u

  21. #define TOS_CFG_IDLE_TASK_STK_SIZE      512u

  22. #define TOS_CFG_CPU_TICK_PER_SECOND     1000u

  23. #define TOS_CFG_CPU_CLOCK               (SystemClockFrequency)

  24. #define TOS_CFG_TIMER_AS_PROC           1u

  25. #define TOS_CFG_MAIL_QUEUE_EN           1u

  26. #endif

【测试】
1、添加头文件#include "tos_k.h"的引用。
2、添加两个任务,分别人1秒、0.5秒的printf。内容如下:
  1. k_task_t task, led_task;

  2. k_stack_t task_stack[256], task_stack_led[256];

  3. void test_task(void *Parameter)
  4. {
  5.         while(1)
  6.         {
  7.                 printf("hello tobuandOS task1\r\n");
  8.                 tos_task_delay(1000);
  9.         }
  10. }

  11. void led_task_entry(void *Parameter)
  12. {
  13.         while(1)
  14.         {
  15.                 printf("hello tobuandOS task2\r\n");
  16.                 tos_task_delay(500);
  17.         }
  18. }

  19. USART_InitType USART_InitStructure;

  20. /**
  21. *\*\name    main.
  22. *\*\fun     Main program.
  23. *\*\param   none
  24. *\*\return  none
  25. **/
  26. int main(void)
  27. {
  28.           k_err_t err;
  29.     RCC_ClocksType RCC_ClocksStatus;
  30.    
  31.     /* System Clocks Configuration */
  32.     RCC_Configuration();

  33.     /* Configure the GPIO ports */
  34.     GPIO_Configuration();

  35.     RCC_Clocks_Frequencies_Value_Get(&RCC_ClocksStatus);

  36.     /* USARTy and USARTz configuration ------------------------------------------------------*/
  37.     USART_InitStructure.BaudRate            = 115200;
  38.     USART_InitStructure.WordLength          = USART_WL_8B;
  39.     USART_InitStructure.StopBits            = USART_STPB_1;
  40.     USART_InitStructure.Parity              = USART_PE_NO;
  41.     USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
  42.     USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;

  43.     /* Configure USARTx */
  44.     USART_Initializes(USARTx, &USART_InitStructure);
  45.     /* Enable the USARTx */
  46.     USART_Enable(USARTx);

  47.     /* Output a message on Hyperterminal using printf function */
  48.     printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
  49.                 tos_knl_init();
  50.           err = tos_task_create(&task, "task1",test_task,NULL, 2, task_stack,128,20);
  51.           err = tos_task_create(&led_task, "task_led",led_task_entry,NULL, 2, task_stack_led,256,20);
  52.                 tos_knl_start();
  53.     while (1)
  54.     {
  55.     }
  56. }
【实现效果】
下载到开发板后,串口中预想中输出的两个不同周期的打印效果。
1.png
【总结】
国产开源的TobudOS能做到体积小单版机里也可以跑的实时OS。移植方便、快捷!
效果图.png
主战坦克 发表于 2024-2-21 08:51 | 显示全部楼层
这个操作系统不错,我使用FreeRTOS的时候,如果两个线程连续进行printf,有可能死机。
 楼主| lulugl 发表于 2024-2-21 09:06 | 显示全部楼层
主战坦克 发表于 2024-2-21 08:51
这个操作系统不错,我使用FreeRTOS的时候,如果两个线程连续进行printf,有可能死机。 ...

感谢关注!
gyh974 发表于 2024-3-12 14:41 | 显示全部楼层
TobudOS支持什么组件?

评论

有很多,我还没有深入学习。  发表于 2024-3-12 16:21
您需要登录后才可以回帖 登录 | 注册

本版积分规则

180

主题

830

帖子

12

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

180

主题

830

帖子

12

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