最近TobudOS捐给了开源原子基金会,我体会了他的系统后,感觉好用,移植也非常轻松,这里跟大家分享一下移植过程。
【源码下载】
网址:https://atomgit.com/OpenAtomFoundation/TobudOS
网速还是非常快的。
【工程模版】
我下载了论坛提供的软件包后解压出来,找到template把他得命名一下。
2、编译一下工程版,确保编译可以通过,并且闪灯与printf可以正常打印。
3、把TobudOS源解压开后,在工程目录中新建os文件夹,并把源码里面的arch、kernel复制到该文件夹里。
3、根据官方提供的资料,ACM32G103 芯片的内核基于 ARMv8-M 架构,支持 Cortex-M33 和 Cortex-M4F,所以我这里选择Cortex-M33内核来移植。
4、在工程,我新建三个工程组,分别为kernel、arc、config:
5、将\os\kernel\core下面所有的.c文件全部添加进os/kernel工程中,将\os\arch\arm\arm-v8m\cortex-m33\armcc目录下面的port_c.c、port_s.S添加到os/arch中、将目录\os\arch\arm\arm-v8m\common添加arch工程组中。
6、从源码的\TobudOS-master\board\BearPi_STM32L431RC\TOS-CONFIG文件夹下复制一份tos_config.h到工程中,并加入os/config分组中。
7、将工程需要的头文件添加进工程中,具体如下:
7、把main.h添加到tos_config.h文件里,找到工程的总线时钟,并将添加了config.h中。
8、注释掉acm32g103_it.c中的PenSV_handle函数,因为在tobudos有定义这个中断函数,否则报重复定义,或者添回__weak也可以。
9、重定定义SysTick_handle函数,为tobudOS提供心跳,当然你也可以自己定义一个1ms的定时器来为系统提供心跳包。
/******************************************************************************
*[url=home.php?mod=space&uid=159083]@brief[/url] : System tick handler
*@param : none
*@return: none
******************************************************************************/
void SysTick_Handler(void)
{
//HAL_IncTick();
if(tos_knl_is_running())
{
tos_knl_irq_enter();
tos_tick_handler();
tos_knl_irq_leave();
}
}
10、在main.c中创建两个任务,代码如下:
#include "main.h"
#include "tos_k.h"
k_task_t task, led_task;
k_stack_t task_stack[1024], task_stack_led[1024];
void test_task(void *Parameter)
{
while(1)
{
printf("hello tobuandOS\r\n");
tos_task_delay(1000);
}
}
void led_task_entry(void *Parameter)
{
while(1)
{
BSP_LED_Toggle();
tos_task_delay(500);
}
}
/******************************************************************************
*@brief : main program
*@param : none
*@return: none
******************************************************************************/
int main(void)
{
uint32_t count=0;
k_err_t err;
HAL_Init();
SystemClock_Config();
BSP_UART_Init();
BSP_LED_Init();
tos_knl_init();
err = tos_task_create(&task, "task1",test_task,NULL, 2, task_stack,1024,20);
err = tos_task_create(&led_task, "task_led",led_task_entry,NULL, 2, task_stack_led,1024,20);
tos_knl_start();
// BSP_LED_On();
// HAL_Delay(500);
// BSP_LED_Off();
//
// while(1)
// {
// BSP_LED_Toggle();
// HAL_Delay(500);
// printfS("%d\r\n",count++);
//
// };
}
【实现效果】
编译后下载到开发板,可以看板载的LED灯规律闪烁,串口助手也打印了:
【心得】航芯科技提供了非常好的工程模版,使得上手非常容易。我看了他们没有操作系统的模版,在这里给他补上吧,如果他们需要,可以在以后工程加入,官方可以联系一下我呀,这里附年移植好的工程: