本帖最后由 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源码以及移植的例程: |