历史上的今天
返回首页

历史上的今天

今天是:2025年02月07日(星期五)

正在发生

2021年02月07日 | STM32Fxxx 上移植 Huawei LiteOS

2021-02-07 来源: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;

    }

}


refer:


https://blog.csdn.net/franklfeng/article/details/64437907

https://blog.csdn.net/sinat_27066063/article/details/84320579 


推荐阅读

史海拾趣

Andon Electronics公司的发展小趣事

Andon Electronics 是一家全球领先的电子元件制造商,以下是该公司发展的相关故事:

  1. 公司成立与初期发展:Andon Electronics 成立于 1984 年,总部位于美国加利福尼亚州。最初,公司主要从事 LED 和其他电子元件的生产和销售。由于对高质量产品和客户服务的执着追求,公司迅速赢得了客户的信任和好评。

  2. 技术创新与产品拓展:随着市场需求的变化和技术的进步,Andon Electronics 不断进行技术创新,并逐步扩大产品线。除了 LED 产品外,公司还推出了多种其他电子元件,包括连接器、电缆组件、线束和传感器等。这些产品在汽车、工业、通信和消费电子等领域得到了广泛应用。

  3. 质量管理和认证:Andon Electronics 一直致力于质量管理和产品认证,确保产品符合国际标准和客户要求。公司拥有 ISO 9001 质量管理体系认证,并不断优化生产流程和质量控制体系,以确保产品质量的稳定性和可靠性。

  4. 全球布局和市场拓展:随着业务的不断发展,Andon Electronics 在全球建立了多个生产基地和销售办事处。除了在美国的总部和生产基地外,公司还在亚洲、欧洲和其他地区设立了办事处和生产工厂,以更好地服务全球客户,并适应当地市场的需求。

  5. 可持续发展和未来展望:Andon Electronics 将继续致力于技术创新、产品拓展和质量管理,以满足客户不断变化的需求。公司将继续关注环保和可持续发展,推动节能减排和资源利用效率的提升。同时,Andon Electronics 也将积极响应行业的变革和挑战,不断调整战略,保持在电子元件制造业的领先地位。

Datatronic公司的发展小趣事

随着市场竞争的加剧,Datatronic公司意识到单纯依靠技术创新已不足以保持竞争优势。于是,公司开始调整市场策略,注重与客户的沟通和合作。通过深入了解客户需求,公司能够提供更符合市场需求的定制化产品和服务。同时,公司还加强了与上下游企业的合作,形成了稳定的供应链体系。

Fanstel公司的发展小趣事

Fanstel公司非常重视企业文化的建设。公司倡导“创新、协作、务实、进取”的企业精神,鼓励员工敢于创新、勇于担当。同时,公司还注重员工的福利待遇和职业发展,为员工创造了一个良好的工作环境和发展空间。这种积极向上的企业文化不仅增强了员工的凝聚力和归属感,也为企业的发展注入了强大的动力。

Fortiming Corporation公司的发展小趣事

背景:2001年9月5日,Fortiming Corporation在内华达州正式成立(来源:企查查)。在成立之初,公司就明确了自己的市场定位——专注于提供高质量的石英晶振、晶体振荡器等频率控制产品。

发展:面对当时竞争激烈的电子行业,Fortiming凭借其对技术的深刻理解和对市场需求的敏锐洞察,迅速在石英晶振领域站稳脚跟。公司不仅注重产品研发,还积极引进先进生产设备,提升产品质量和生产效率。

AirBorn公司的发展小趣事

AirBorn公司成立于1958年,总部位于得克萨斯州奥斯汀。在创立之初,AirBorn就致力于设计、制造和销售高性能连接器和电缆组件。随着电子技术的飞速发展,AirBorn敏锐地捕捉到航空航天领域对高性能连接器的需求,并开始了针对这一领域的定制化产品研发。凭借卓越的技术实力和创新能力,AirBorn很快在航空航天连接器市场占据了一席之地。

Compound Photonics公司的发展小趣事

在Micro LED领域,Compound Photonics同样展现出了强大的实力。公司曾与Plessey合作开发Micro LED产品,双方的合作一度被业界看好。然而,就在合作即将取得突破时,Meta公司突然出手收购了Plessey的产能,使得Compound Photonics失去了一个重要的合作伙伴。面对这一突如其来的竞争压力,Compound Photonics不得不重新调整战略,寻找新的合作伙伴。

问答坊 | AI 解惑

基于FPGA的DDS调频信号的研究与实现

基于FPGA的DDS调频信号的研究与实现…

查看全部问答>

宁波,招聘电子工程师二名

招聘启示电子工程师二名 要求:大专以上学历, 懂安防系统的设计,模拟电路设计,会电子线路设计,工作能力强,能独挡一面,至少三年工作经验.有意者,可发简历到邮箱,或电话联系,谢谢! 宁波三阳电器有限公司 地址:宁波市鄞州区下应街道蔡家漕工业区10幢 ...…

查看全部问答>

dsp课件下载

上传老师的dsp课件,希望对想学习DSP和参加这次DIY活动的朋友有用!…

查看全部问答>

Altium Designer 原理图和PCB多通道设计方法介绍

转载自:http://bbs.21ic.com/icview-141848-1-1.html by:pk.kong 曾经把不少ad6的资料整理想发出来,后来发现用ad6的朋友并不多,所以一直没有动手。 不过最近好几个朋友问ad6这个多通道设计的问题。特别是许mm,可是每次我都忘记把资料带回来 ...…

查看全部问答>

PIC单片机做RS-485通讯时遇到的问题,急请高手指教!!

我以前用过MEGA64和51做RS485通讯效果都很好,但是这次用PIC16F877A就遇到比较麻烦的问题,请各位高手指点!! 应用要求:一个主控板,通过轮询方式访问多个子节点。轮询时间间隔是0.5s 硬件:MAX487,用光耦TLP521隔离,单片机是PIC16F877A 问 ...…

查看全部问答>

运放稳定性-(第七第八部分)

本帖最后由 dontium 于 2015-1-23 13:11 编辑 第七部分:Ro何时转变为Zo?第八部分:电容负载稳定性-噪声增益及Cf …

查看全部问答>

大学期间不妨看看的书

1:《狼图腾》姜戎      2:《不能承受生命之轻》米兰.昆德拉 3:《借我一生》余秋雨 4:《平凡的世界》路遥 5:《文化苦旅》余秋雨 6:《如何做最好的自己》王宇 7:《一网情深》李开复 8:《退步集》陈丹青 9 ...…

查看全部问答>

超声波遥控

想做遥控器,对超声波遥控不了解,一般压电类型发射头发射有效距离多远? 做过的朋友能多讲讲么?…

查看全部问答>

空气中的工频50Hz是怎么来的?

是由于我们使用的用电线路是50Hz交流导致的吗?…

查看全部问答>

工控老鬼 工控人生 “说说身边的自动化”

       老鬼下午还在深圳,晚上已经到了天府之国成都。我想这个对于做自动化的人老说应该不是很稀奇的事情。        一路上边走边看,记录下了路上的点点见闻。老鬼就点拨下和自动化相关的乱七八糟。 &n ...…

查看全部问答>