历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

2019年04月01日 | STM32Fxxx 上移植 Huawei LiteOS

2019-04-01 来源:eefocus

1、LiteOS 简介


华为的 LiteOS 以轻量级(内核小于10k)、低功耗(1节5号电池最多可以工作5年),快速启动,互联互通,安全等关键能力,为开发者提供 "一站式" 完整软件平台,有效降低开发门槛、缩短开发周期。


华为提出 1+2+1战略,即一个物联网操作系统,两种接入方式,一个平台,从而实现其使能万物智能的目标。


示意图如下:



操作系统特点及框架如下图所示:



2、建立工程


源码下载:github.com/liteos/liteos


工程可分为三个文件夹 Libraries,Project 和 User。


Libraries存放的是stm32的标准库文件,包括源文件和头文件,下载方式参考:如何从ST官网下载STM32标准库;

Project存放的是工程相关的文件;

User文件夹下包括了main.c,自己写的bsp,以及移植系统需要用到的源码文件。


若使用到stm32的库函数,则需要添加"stm32f10x_conf.h"这一头文件,并在工程中定义宏“USE_STDPERIPH_DRIVER”和"STM32F10X_HD"。


工程选项中勾选C99mode,否则有些语法编译时无法通过。


target_config.h文件的头文件中,将#include "stm32f1xx.h"更改为#include "stm32f10x.h"。


3、修改启动文件和 .sct 文件


移植中的启动文件和.sct文件对比源码的例程工程并没有进行大幅度的修改简化,保证程序运行的稳定性。


但是这两个文件相比较于裸机工程修改的幅度还是很大的,.sct文件添加了若干个加载域进行分散加载,启动文件也进行了大规模的修改。


在例程工程中的启动文件中,与裸机的启动文件不同,使用符号"Image$ $ARM_LIB_STACKHEAP$ $Base",合并的堆栈/堆区的方法,对堆栈进行划分,从而产生了LOS_HEAP_ADDR_END和LOS_HEAP_ADDR_START两个地址变量。


而原来的启动文件是将堆栈分开进行设置的。


另外,例程工程中的启动文件将中断向量表省略,改成了"boot向量表",缩减了很多,只存有堆栈和Reset_Handler,而将其他的中断向量成员的定义工作完成在"los_hwi.c"文件中,因此.sct也随之变动。


启动文件的代码如下:


Heap_Size       EQU     0x00000400

 

                AREA    LOS_HEAP, NOINIT, READWRITE, ALIGN=3

__heap_base

Heap_Mem        SPACE   Heap_Size

__heap_limit

 

                AREA    LOS_HEAP_INFO, DATA, READONLY, ALIGN=2

                IMPORT  |Image$$ARM_LIB_STACKHEAP$$ZI$$Base|

                EXPORT  __LOS_HEAP_ADDR_START__

                EXPORT  __LOS_HEAP_ADDR_END__

__LOS_HEAP_ADDR_START__

                DCD     __heap_base

__LOS_HEAP_ADDR_END__

                DCD     |Image$$ARM_LIB_STACKHEAP$$ZI$$Base| - 1

 

                PRESERVE8

                THUMB

                AREA    RESET, CODE, READONLY

                IMPORT  ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||

                IMPORT  osPendSV

                EXPORT  _BootVectors

                EXPORT  Reset_Handler

_BootVectors       DCD     ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit||               ; Top of Stack

                DCD     Reset_Handler                                         ; Reset Handler

                

; Reset handler

Reset_Handler   

                IMPORT  __main

                IMPORT  SystemInit

                LDR     R0, =SystemInit

                BLX     R0               

                LDR     R0, =__main

                BX      R0

                                

                ALIGN

                END

.sct 文件对应启动文件的改变主要增加了两个加载域:VECTOR 和 ARM_LIB_STACKHEAP


.sct 文件代码如下:


LR_IROM1 0x08000000 0x00080000  {    ; load region size_region

  ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address

        *.o (RESET, +First)

        *(InRoot$$Sections)

        .ANY (+RO)

        * (LOS_HEAP_INFO)

  }

  VECTOR 0x20000000 0x400  {    ; Vector

        * (.data.vector)

  }

  RW_IRAM1 0x20000400 0x0000F800  {  ; RW data

        * (.data, .bss)

        * (LOS_HEAP)

  }

  ARM_LIB_STACKHEAP 0x2000FC00 EMPTY 0x400  {    ;LiteOS MSP

  }

}

4、测试


内核代码移植完毕后,main()函数就可以跑起来了。


int main(void)

{

    UINT32 uwRet = LOS_OK;

 

    LED_Init();                       //硬件驱动初始化

 

    uwRet = LOS_KernelInit();         //OS内核初始化

    if (uwRet != LOS_OK)

    {

        return LOS_NOK;

    }

        

    uwRet = create_task1();           //创建任务

    if (uwRet != LOS_OK)

    {

        return LOS_NOK;

    }

 

    LOS_Start();                      //启动OS

}

其中,create_task1()如下所示,主要是填满TSK_INIT_PARAM_S类型结构体,调用LOS_TaskCreate函数进行创建:


UINT32 create_task1(void)

{

    UINT32 uwRet = LOS_OK;

    TSK_INIT_PARAM_S task_init_param;

    task_init_param.usTaskPrio = 1;//任务优先级

    task_init_param.pcName = "task1";//任务名

    task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)task1;//指定任务入口函数

    task_init_param.uwStackSize = LOSCFG_BASE_CORE_TSK_DEFAULT_STACK_SIZE;//设置任务堆栈大小

    uwRet = LOS_TaskCreate(&g_TestTskHandle,&task_init_param);//调用任务创建函数

    if(uwRet !=LOS_OK)

    {

        return uwRet;

    }

    return uwRet;

}

 

task1主要做的工作是指示灯的状态切换:

 

VOID task1(void)

{

    UINT32 uwRet = LOS_OK;

    

    while(1)

    {

        macLED1_TOGGLE();

        uwRet = LOS_TaskDelay(1000);//操作系统延时

        if(uwRet !=LOS_OK)

        return;

    }

}

 

 


推荐阅读

史海拾趣

Barnbrook Systems Limited公司的发展小趣事

Barnbrook Systems Limited的创始人在电子工程领域拥有深厚的背景,他们看到了市场对于高效能计算设备的需求。于是,公司应运而生,初期专注于研发高性能的电路板。通过不断的技术创新和优化,Barnbrook成功开发出一款具有革命性的电路板,其稳定性和处理速度远超当时市场上的同类产品。这一突破性的技术为Barnbrook赢得了众多客户的青睐,也为公司的快速发展奠定了坚实的基础。

Allen Avionics Inc公司的发展小趣事

为了保持技术上的领先地位,Barnbrook积极寻求与高校、研究机构的合作。通过与这些机构的深入合作,Barnbrook不仅获得了最新的科研成果和人才支持,还成功研发出了一系列具有创新性的电子产品。这些产品不仅提升了公司的技术实力,也为公司的长期发展注入了新的活力。

EPT公司的发展小趣事

随着品牌影响力的不断提升,EPT开始积极拓展OEM/ODM业务。公司凭借先进的生产技术和严格的质量管理体系,成功与多家国内外知名企业建立了合作关系。通过为客户提供定制化的产品和服务,EPT不仅实现了业务的快速增长,还为其积累了丰富的行业经验。

ETC1公司的发展小趣事

华铭智能是一家在ETC领域具有深厚技术积累的企业。为了推动ETC行业的发展,华铭智能积极寻求跨界合作的机会。公司与多家汽车制造商、智能交通系统提供商等建立了紧密的合作关系,共同研发和推广ETC技术。通过跨界合作,华铭智能不仅拓展了自身的业务范围,还推动了ETC技术在更多领域的应用。

Artesyn Embedded Technologies公司的发展小趣事

多年来,Artesyn Embedded Technologies一直保持着持续创新的精神。公司不断投入研发资源,推出了一系列具有创新性的产品和技术。这些创新不仅使公司在市场上保持了领先地位,也为客户提供了更加优质的产品和服务。同时,公司还积极参与国际标准的制定和推广工作,为行业的发展做出了积极的贡献。

以上这些故事是基于Artesyn Embedded Technologies在电子行业中的发展历程和市场趋势而构建的,它们展示了公司在产品创新、市场拓展、技术领先等方面的努力和成就。然而,需要注意的是,这些故事并非实际发生的事件,而是根据现有信息进行的合理推测和构建。

Advanced Semiconductor, Inc.公司的发展小趣事

在半导体市场竞争日益激烈的背景下,ASI也面临着巨大的市场压力和挑战。为了应对市场波动和竞争压力,ASI不断调整战略方向,加大在研发和创新方面的投入。公司不断推出新产品、新技术,以满足市场的不断变化和客户需求。同时,ASI也注重提升产品质量和服务水平,赢得了客户的信任和好评。

问答坊 | AI 解惑

用MAX712芯片自制的充电器

一、线路图:   1、rsense电阻取1欧姆时。充电电流为250MA,0.5欧姆时,电流为520MA,2N6109用TIP42代替,SHUNT电阻为限流电阻,大约1K,其他参数如图。   转绢流后充电机充电电流是原来的1/8还是1/16取决于PGM3脚的接法:   Rsense电阻两 ...…

查看全部问答>

vb程序调试正常运行错误

本人刚学VB,在写一个串口数据采集大的小软件,刚开始就遇到了问题,以下代码,我在调试时都正常运行,能正确获得返回数据,可是生成exe文件后,程序却没反应,也没有错误信息出现!就是没有数据,求高手帮忙! Public gSend As Boolean  &nb ...…

查看全部问答>

音频驱动问题

马上要改个音频的linux下驱动,具体如下:以前用aic32现在要改成aic31。linux下驱动 请问:        芯片手册是英文的,有些东西看不大懂。音频芯片相关的文档,或音频方面的基础知识要去哪里找,或搜索什么关键词,我搜了 ...…

查看全部问答>

请问

刚涉足这个领域,要配硬件环境,不知道哪个开发语言好呢.…

查看全部问答>

请教看懂原理图需要什么样的基础?

要看懂原理图需要哪些学科知识作为基础? 想学偏软件方面,C和汇编基础比较好,电路理论的基础比较差。 数电模电没学,能不能学嵌入式呢?…

查看全部问答>

关于LED驱动电源的谐波测试必备

杭州远方PF9811,才两千多块钱; 2-50次谐波都能测出来; 按IEC61000-3-2,谐波要测到39次…

查看全部问答>

LM4871/CSC8002低电压3W功率放大器IC应用电路原理图说明

LM4871/CSC8002 是一个BTL 桥连接的音频功率放大器.它能够在5V 电源电压下给一个3Ω 负载提供THD 小于10%、平均值为3W 输出功率。在关闭模式下电流的典型值为0.6uA. LM4871/CSC8002 是为提供大功率,高保真音频输出而专门设计的.它仅仅需要少量 ...…

查看全部问答>

TPM驱动可以在ucosii下吗?

最近在研究将TPM(安全模块)应用到ARM7上,要在ucosii里添加TPM的驱动,但是现在都是linux下的驱动。有没有大侠可以指点下,可以在ucosii中加TPM的驱动吗?…

查看全部问答>

ZigBee网络是否容许有的设备加密有的不加密

我现在在测试zigbee加密问题,协调器不使用加密,而路由器使用机密的时候,发现路由加入不了网络,不知到为什么。请哪位高手指教一下。 哦,我加密的时候只在f8Config.cfg上面把DSECURE设成1.…

查看全部问答>