[资源分享] AC78xx liteos移植

[复制链接]
 楼主| JasonLee27 发表于 2020-11-27 10:25 | 显示全部楼层 |阅读模式
本帖最后由 JasonLee27 于 2020-11-27 10:25 编辑

硬件环境: AC781x 通用开发板,ATC-LINK软件环境:keil 5.23

最近看到有很多人提到huawei 的liteos,便花了点时间尝试移植了一下内核部分,简单运行了一下,大体能正常运行,便拿出来分享一下,也欢迎各位大大提出宝贵的意见

【step1】源码获取
选了很久,最终选择了github上的源码,这里我们选择了LiteOS-develop分支(因为master移植的时候发现很多文件结构变化,对整个代码架构还没理清
https://github.com/LiteOS/LiteOS

【step2】准备AC78xx工程
这里我使用了我自己之前写的gpio_demo工程


【step3】拷贝文件
从源码中拷贝arch,demos,kernel三个文件夹到项目工程的Middleware/LiteOS下,从targets/Mini_Project/cortex-m3_without_driver下拷贝 OS_CONFIG文件夹到项目工程User目录下

a.png

【step4】代码裁剪
删除不必要的代码,进入Middleware/LiteOS/arch目录,删除msp430文件夹
进入arch/arm/arm-m目录,保留自己对应内核的文件夹,这里我们使用cortex-m3内核,所以m0,m4,m7文件夹都可以删除
进入Middleware/LiteOS/demos文件夹,保留kernel文件夹,其余删除。

该文件夹下是功能测试代码,我们这里只测试kernel,其余文件夹可依据自身功能选择合适的测试代码。

【step5】添加工程文件
新建LiteOS/arch group,并添加如下4个文件

1.png

添加LiteOS/kernel group,
  • l  添加LiteOS/kernel/base/core下.c文件
  • l  添加LiteOS/kernel/base/ipc下.c文件
  • l  添加LiteOS/kernel/base/mem/bestfit_little下.c文件
  • l  添加LiteOS/kernel/base/mem/common下.c文件
  • l  添加LiteOS/kernel/base/mem/membox下.c文件
  • l  添加LiteOS/kernel/base/misc下.c文件
  • l  添加LiteOS/kernel/base/mem/om下.c文件
  • l  添加LiteOS/kernel/los_init.c
11.png
添加LiteOS/demo group,添加如下文件: 111.png

【step6】添加头文件路径
3.png

【step7】修改代码
打开target_config.h,将#include "__hal_simulate.h"修改为#include"ac78xx.h"(如果是AC7801x芯片则#include "ac780x.h")。
在target_config.h中,将SystemCoreClock修改为SYSCLK_FREQ。这是因为AC781x中未定义SystemCoreClock变量,但在AC780x中有定义,可不用修改。

【step8】任务测试
首先,将之前的main函数修改为一个任务,重新编写一个main函数,新建两个任务可以从target文件夹下找到相应的模板,这里建立了两个任务,一个响应按键,翻转LED,一个定时500ms翻转LED,将程序编译烧录进AC78xx demo板并运行,可以看到LED会500ms闪烁,按KEY6,KEY7按键,LED会翻转。
  1. UINT32 creat_demo_task(void)
  2. {
  3.     UINT32 uwRet = LOS_OK;
  4.     TSK_INIT_PARAM_S task_init_param;

  5.     task_init_param.usTaskPrio = 0;
  6.     task_init_param.pcName = "demo_task";
  7.     extern void fs_demo(void);
  8.     task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)demoTask;


  9.     task_init_param.uwStackSize = 0x1000;

  10.     uwRet = LOS_TaskCreate(&g_demo_tskHandle, &task_init_param);
  11.     if(LOS_OK != uwRet)
  12.     {
  13.         return uwRet;
  14.     }
  15.     return uwRet;
  16. }
  17. UINT32 creat_demo2_task(void)
  18. {
  19.     UINT32 uwRet = LOS_OK;
  20.     TSK_INIT_PARAM_S task_init_param;

  21.     task_init_param.usTaskPrio = 0;
  22.     task_init_param.pcName = "demo2_task";
  23.     extern void fs_demo(void);
  24.     task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)demo2Task;


  25.     task_init_param.uwStackSize = 0x1000;

  26.     uwRet = LOS_TaskCreate(&g_demo2_tskHandle, &task_init_param);
  27.     if(LOS_OK != uwRet)
  28.     {
  29.         return uwRet;
  30.     }
  31.     return uwRet;
  32. }

  33. int main(void)
  34. {
  35.     UINT32 uwRet = LOS_OK;
  36.     InitDebug();
  37.     KEY_Init();    /* init key gpio */
  38.     LED_Init();    /* init led gpio */
  39.     uwRet = LOS_KernelInit();
  40.     if (uwRet != LOS_OK)
  41.     {
  42.         return LOS_NOK;
  43.     }

  44.     uwRet =creat_demo_task();
  45.         
  46.     if (uwRet != LOS_OK)
  47.     {
  48.         return LOS_NOK;
  49.     }
  50.     uwRet =creat_demo2_task();
  51.         
  52.     if (uwRet != LOS_OK)
  53.     {
  54.         return LOS_NOK;
  55.     }
  56.     LOS_Demo_Entry();

  57.     (void)LOS_Start();
  58.     return 0;
  59. }
  60. /**
  61. * main
  62. *
  63. * @param[in]  none
  64. * [url=home.php?mod=space&uid=266161]@return[/url] none
  65. *
  66. * [url=home.php?mod=space&uid=247401]@brief[/url]  main function
  67. *
  68. */
  69. void demoTask(void)
  70. {
  71.     static uint8_t s_key6Up = 1;    /* key6 push/pop status   1:pop  0:push */
  72.     static uint8_t s_key7Up = 1;    /* key7 push/pop status   1:pop  0:push */
  73.   //  InitDelay();
  74.     while(1)
  75.     {
  76.         if (s_key6Up && KEY6 == 0)
  77.         {
  78.             LOS_TaskDelay(10);
  79.             if (s_key6Up && KEY6 == 0)
  80.             {
  81.                 LED2 = !LED2;    /* toggle LED2 output */
  82.                 if (s_key6Up == 1)
  83.                 {
  84.                     s_key6Up = 0;
  85.                 }
  86.             }
  87.         }
  88.         else
  89.         {
  90.             if (s_key6Up == 0 && KEY6 == 1)
  91.             {
  92.                 s_key6Up = 1;
  93.             }
  94.         }

  95.         if (s_key7Up && KEY7 == 0)
  96.         {
  97.             LOS_TaskDelay(10);
  98.             if (s_key7Up && KEY7 == 0)
  99.             {
  100.                 LED3 = !LED3;    /* toggle LED3 output */
  101.                 if (s_key7Up == 1)
  102.                 {
  103.                     s_key7Up = 0;
  104.                 }
  105.             }
  106.         }
  107.         else
  108.         {
  109.             if (s_key7Up == 0 && KEY7 == 1)
  110.             {
  111.                 s_key7Up = 1;
  112.             }
  113.         }
  114.         
  115.         LOS_TaskDelay(20);
  116.     }
  117. }


  118. void demo2Task(void)
  119. {
  120.     LED_Init();    /* init led gpio */
  121.    
  122.     while (1)
  123.     {
  124.         LED3 = !LED3;    /* toggle LED3 output */
  125.         LED2 = !LED2;    /* toggle LED3 output */
  126.         LOS_TaskDelay(500);
  127.     }
  128. }
【step9】kernel测试
liteos提供了内核各功能的测试例程,我们也来验证一下
还记得之前添加的demo文件夹,里面有用于测试kernel的代码。
  • 在gpio_demo.c上添加#include"los_inspect_entry.h"头文件。
  • 在main函数中调用LOS_Demo_Entry();函数。
  • 在los_demo_debug.h中启用#define LOS_KERNEL_DEBUG_OUT宏。
  • 在los_demo_entry.c中添加如下宏(因为未使能OS管理中断,所以这里不测试中断)
#define LOS_KERNEL_TEST_TASK
#defineLOS_KERNEL_TEST_MEM_DYNAMIC
#defineLOS_KERNEL_TEST_MEM_STATIC
//#defineLOS_KERNEL_TEST_INTRRUPT
#define LOS_KERNEL_TEST_QUEUE
#define LOS_KERNEL_TEST_EVENT
#define LOS_KERNEL_TEST_MUTEX
#define LOS_KERNEL_TEST_SEMPHORE
#define LOS_KERNEL_TEST_SYSTICK
#define LOS_KERNEL_TEST_SWTIMER

#define LOS_KERNEL_TEST_LIST

注意:1,打印输出,要使用AC78xx自带的debugout模块,通过UART2进行打印。2,SRAM我使用了默认的配置,因为刚好地址一致,大小我也没有修改,为40KB,大家可根据需要修改。#define BOARD_SRAM_START_ADDR     0x20000000
#define BOARD_SRAM_SIZE_KB       40

#define BOARD_SRAM_END_ADDR       (BOARD_SRAM_START_ADDR + 1024 * BOARD_SRAM_SIZE_KB)



最后,附上liteos源码以及移植的例程:
LiteOS-develop.zip (18.72 MB, 下载次数: 16) (github源码)
LiteOS_sample.rar (3.28 MB, 下载次数: 15) (sample)
liangshuang95 发表于 2020-12-10 08:01 来自手机 | 显示全部楼层
现在OS太多了,都不知道选哪个了。
 楼主| JasonLee27 发表于 2020-12-10 11:51 | 显示全部楼层
liangshuang95 发表于 2020-12-10 08:01
现在OS太多了,都不知道选哪个了。

就是OS太多了,所以每个都要移植,我倒希望就只有一个OS,这样就不用移植那么多了
jiangyongabc 发表于 2020-12-11 18:44 来自手机 | 显示全部楼层
可以搞一下鸿蒙OS
daichaodai 发表于 2020-12-12 14:43 来自手机 | 显示全部楼层
占用内存空间大吗?
 楼主| JasonLee27 发表于 2020-12-14 14:40 | 显示全部楼层
daichaodai 发表于 2020-12-12 14:43
占用内存空间大吗?

liteos本身是轻量级的,而且可裁剪的。
嵌入小菜菜 发表于 2020-12-17 20:58 | 显示全部楼层
感谢楼主的分享,不错的帖子,棒棒的。

单片小菜 发表于 2020-12-21 11:20 | 显示全部楼层
已经下载了,源码,感谢楼主的分享,辛苦了。
weict125 发表于 2020-12-22 09:30 | 显示全部楼层
赞赞
不知道取啥名 发表于 2020-12-22 11:07 | 显示全部楼层
JasonLee27 发表于 2020-12-10 11:51
就是OS太多了,所以每个都要移植,我倒希望就只有一个OS,这样就不用移植那么多了
...

芜湖有很多车厂一级供应商,昌辉,宏景,莫森泰克,安瑞光电,伯特利,埃泰克,怎么不见你们推广,芜湖都是在用国外的MCU
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

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