打印
[应用相关]

N32G401移植TobudOS

[复制链接]
5152|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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包的目录下有压缩文件,打开后可以得官方提供的驱动库以及示例工程:

其的目录比较新,可以把包复制到上几层目录,方例查找。
6、打开示例工程中的printf示例,这个示例帮我们生成了串品打印的工程,我们在这个工程中来实现TobudOS的移植。
7、我打开工程将例程下载到开发板,保存能打印出信息,我这里在串品助手中出现如下信息,说明工程一切正常。
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:

6、添加内核需要的文件到工程中,从keil的工程中我们看到N32G401为arm_M4F内核。
所以我把\os\arch\arm\arm-v7m\cortex-m4\armcc下在的两文件port_c.c 、port_s.S添加进工程。

同时把\os\arch\arm\arm-v7m\common下面的tos_cpu.c、tos_fault.c添加进arch的分组中:

如果大家要想文件夹内容小,可以把arch下其的文件删掉。
7、添加kernel工程分配,我们把\os\core下面所有的.c都添加kernel分组中。

同时把\os\osal\cmsis_os,下面的cmsis_os添加进工程。

8、从官方示例中下载一个config文件到config文件夹里,并把它添加进OS/config工程分组中。
9、添回文件头文件到工程中,如果下图所示:

10、打开配置钩选c99.

11、注释掉n32f401_it.c中的void PendSv_Handler函数,去除重复定义的错误。
12、添加#include "tos_k.h"头文件,并把TobudOS心跳到systick函数中:
void SysTick_Handler(void)
{
       
        if(tos_knl_is_running())
        {
                tos_knl_irq_enter();
                tos_tick_handler();
                tos_knl_irq_leave();
        }
}
13、其配置文件修改如下:
#ifndef _TOS_CONFIG_H_
#define  _TOS_CONFIG_H_

#include "main.h"


#include <stdio.h>

extern uint32_t SystemClockFrequency;

#define TOS_CFG_TASK_PRIO_MAX           10u

#define TOS_CFG_ROUND_ROBIN_EN          1u

#define TOS_CFG_OBJECT_VERIFY_EN        1u

#define TOS_CFG_OBJ_DYNAMIC_CREATE_EN   1u

#define TOS_CFG_EVENT_EN                1u

#define TOS_CFG_MMBLK_EN                1u

#define TOS_CFG_MMHEAP_EN               1u

#define TOS_CFG_MMHEAP_DEFAULT_POOL_SIZE        0x500

#define TOS_CFG_MUTEX_EN                1u

#define TOS_CFG_TIMER_EN                1u

#define TOS_CFG_PWR_MGR_EN              0u

#define TOS_CFG_TICKLESS_EN             0u

#define TOS_CFG_SEM_EN                  1u

#define TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN      1u

#define TOS_CFG_FAULT_BACKTRACE_EN      0u

#define TOS_CFG_IDLE_TASK_STK_SIZE      512u

#define TOS_CFG_CPU_TICK_PER_SECOND     1000u

#define TOS_CFG_CPU_CLOCK               (SystemClockFrequency)

#define TOS_CFG_TIMER_AS_PROC           1u

#define TOS_CFG_MAIL_QUEUE_EN           1u

#endif

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

k_stack_t task_stack[256], task_stack_led[256];

void test_task(void *Parameter)
{
        while(1)
        {
                printf("hello tobuandOS task1\r\n");
                tos_task_delay(1000);
        }
}

void led_task_entry(void *Parameter)
{
        while(1)
        {
                printf("hello tobuandOS task2\r\n");
                tos_task_delay(500);
        }
}

USART_InitType USART_InitStructure;

/**
*\*\name    main.
*\*\fun     Main program.
*\*\param   none
*\*\return  none
**/
int main(void)
{
          k_err_t err;
    RCC_ClocksType RCC_ClocksStatus;
   
    /* System Clocks Configuration */
    RCC_Configuration();

    /* Configure the GPIO ports */
    GPIO_Configuration();

    RCC_Clocks_Frequencies_Value_Get(&RCC_ClocksStatus);

    /* USARTy and USARTz configuration ------------------------------------------------------*/
    USART_InitStructure.BaudRate            = 115200;
    USART_InitStructure.WordLength          = USART_WL_8B;
    USART_InitStructure.StopBits            = USART_STPB_1;
    USART_InitStructure.Parity              = USART_PE_NO;
    USART_InitStructure.HardwareFlowControl = USART_HFCTRL_NONE;
    USART_InitStructure.Mode                = USART_MODE_RX | USART_MODE_TX;

    /* Configure USARTx */
    USART_Initializes(USARTx, &USART_InitStructure);
    /* Enable the USARTx */
    USART_Enable(USARTx);

    /* Output a message on Hyperterminal using printf function */
    printf("\n\rUSART Printf Example: retarget the C library printf function to the USART\n\r");
                tos_knl_init();
          err = tos_task_create(&task, "task1",test_task,NULL, 2, task_stack,128,20);
          err = tos_task_create(&led_task, "task_led",led_task_entry,NULL, 2, task_stack_led,256,20);
                tos_knl_start();
    while (1)
    {
    }
}
【实现效果】
下载到开发板后,串口中预想中输出的两个不同周期的打印效果。

【总结】
国产开源的TobudOS能做到体积小单版机里也可以跑的实时OS。移植方便、快捷!

效果图.png (235.26 KB )

效果图.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支持什么组件?

使用特权

评论回复
评论
lulugl 2024-3-12 16:21 回复TA
有很多,我还没有深入学习。 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

145

主题

715

帖子

9

粉丝