打印
[资源分享]

AC78xx liteos移植

[复制链接]
12116|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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目录下



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

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

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


添加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
添加LiteOS/demo group,添加如下文件:

【step6】添加头文件路径

【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会翻转。
UINT32 creat_demo_task(void)
{
    UINT32 uwRet = LOS_OK;
    TSK_INIT_PARAM_S task_init_param;

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


    task_init_param.uwStackSize = 0x1000;

    uwRet = LOS_TaskCreate(&g_demo_tskHandle, &task_init_param);
    if(LOS_OK != uwRet)
    {
        return uwRet;
    }
    return uwRet;
}
UINT32 creat_demo2_task(void)
{
    UINT32 uwRet = LOS_OK;
    TSK_INIT_PARAM_S task_init_param;

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


    task_init_param.uwStackSize = 0x1000;

    uwRet = LOS_TaskCreate(&g_demo2_tskHandle, &task_init_param);
    if(LOS_OK != uwRet)
    {
        return uwRet;
    }
    return uwRet;
}

int main(void)
{
    UINT32 uwRet = LOS_OK;
    InitDebug();
    KEY_Init();    /* init key gpio */
    LED_Init();    /* init led gpio */
    uwRet = LOS_KernelInit();
    if (uwRet != LOS_OK)
    {
        return LOS_NOK;
    }

    uwRet =creat_demo_task();
        
    if (uwRet != LOS_OK)
    {
        return LOS_NOK;
    }
    uwRet =creat_demo2_task();
        
    if (uwRet != LOS_OK)
    {
        return LOS_NOK;
    }
    LOS_Demo_Entry();

    (void)LOS_Start();
    return 0;
}
/**
* main
*
* @param[in]  none
* [url=home.php?mod=space&uid=266161]@return[/url] none
*
* [url=home.php?mod=space&uid=247401]@brief[/url]  main function
*
*/
void demoTask(void)
{
    static uint8_t s_key6Up = 1;    /* key6 push/pop status   1:pop  0:push */
    static uint8_t s_key7Up = 1;    /* key7 push/pop status   1:pop  0:push */
  //  InitDelay();
    while(1)
    {
        if (s_key6Up && KEY6 == 0)
        {
            LOS_TaskDelay(10);
            if (s_key6Up && KEY6 == 0)
            {
                LED2 = !LED2;    /* toggle LED2 output */
                if (s_key6Up == 1)
                {
                    s_key6Up = 0;
                }
            }
        }
        else
        {
            if (s_key6Up == 0 && KEY6 == 1)
            {
                s_key6Up = 1;
            }
        }

        if (s_key7Up && KEY7 == 0)
        {
            LOS_TaskDelay(10);
            if (s_key7Up && KEY7 == 0)
            {
                LED3 = !LED3;    /* toggle LED3 output */
                if (s_key7Up == 1)
                {
                    s_key7Up = 0;
                }
            }
        }
        else
        {
            if (s_key7Up == 0 && KEY7 == 1)
            {
                s_key7Up = 1;
            }
        }
        
        LOS_TaskDelay(20);
    }
}


void demo2Task(void)
{
    LED_Init();    /* init led gpio */
   
    while (1)
    {
        LED3 = !LED3;    /* toggle LED3 output */
        LED2 = !LED2;    /* toggle LED3 output */
        LOS_TaskDelay(500);
    }
}
【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) (github源码)
LiteOS_sample.rar (3.28 MB) (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

使用特权

评论回复
5
daichaodai| | 2020-12-12 14:43 | 只看该作者
占用内存空间大吗?

使用特权

评论回复
6
JasonLee27|  楼主 | 2020-12-14 14:40 | 只看该作者
daichaodai 发表于 2020-12-12 14:43
占用内存空间大吗?

liteos本身是轻量级的,而且可裁剪的。

使用特权

评论回复
7
嵌入小菜菜| | 2020-12-17 20:58 | 只看该作者
感谢楼主的分享,不错的帖子,棒棒的。

使用特权

评论回复
8
单片小菜| | 2020-12-21 11:20 | 只看该作者
已经下载了,源码,感谢楼主的分享,辛苦了。

使用特权

评论回复
9
weict125| | 2020-12-22 09:30 | 只看该作者
赞赞

使用特权

评论回复
10
不知道取啥名| | 2020-12-22 11:07 | 只看该作者
JasonLee27 发表于 2020-12-10 11:51
就是OS太多了,所以每个都要移植,我倒希望就只有一个OS,这样就不用移植那么多了
...

芜湖有很多车厂一级供应商,昌辉,宏景,莫森泰克,安瑞光电,伯特利,埃泰克,怎么不见你们推广,芜湖都是在用国外的MCU

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

10

粉丝