软件环境:Keil 5

Huawei_LiteOS Version:2018.11.21

源代码下载地址:

移植代码分享(包含源码):

1.  源码文件及目录介绍

如图所示,源码共有6个目录,移植需要使用到的代码在下面用红色标记:

/arch /arm /arm-mM核中断、调度、tick相关代码

/common                                               arm核公用的cmsis core接口(这个可以在keil直接设置)

/components /cmsisLiteOS提供的cmsis os接口实现

/connectivity /agent_tiny                  agent_tiny端云互通组件

/lwm2m                       lwm2m协议实现

/net /lwip_port                                  lwip驱动及OS适配代码

/lwip-2.0.3                                 lwip协议实现

/security /mbedtls /mbedtls_port     MBEDTLS的OS适配代码

/mbedtl-2.6.0      MBEDTLS协议实现

/doc                                                                          此目录存放的是LiteOS的使用文档和API说明等文档

/examples供开发者测试LiteOS内核的demo示例,此目录存放的是内核功能测试用的相关用例的代码

/kernel /base /coreLiteOS基础内核代码,包括队列、task调度、软timer、时间片计算等功能

/om与错误处理相关的文件

/includeLiteOS内核内部使用的头文件

/ipcLiteOS中task间通讯的相关接口,包括事件、信号量、消息队列、互斥锁等

/memLiteOS中的内核内存管理的相关代码

/misc内存对齐功能以及毫秒级休眠sleep功能

/extended /tickless低功耗框架代码

/includeLiteOS开源内核头文件

/targets                                                                    不同内核的板端工程代码(含原厂芯片驱动)

由于这里移植的是stm32f1,系统中需要使用到配置文件,在移植时需要复制以下目录中的三个头文件:

/targets/STM32F103RB_NUCLEO/OS_CONFIG/(los_builddef.h, los_printf.h, target_config.h)

/targets/STM32F103RB_NUCLEO也将作为的例程工程进行移植的参考和学习。

2.  建立工程

工程可分为三个文件夹Libraries,Project和User。Libraries存放的是stm32的库文件,包括源文件和头文件;

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

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

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

main.c文件中的main()函数暂时先不做任何工作。最后在工程中添加所有使用到的头文件的目录。

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

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

在完成上面的工作后,编译会生成两个错误:

值得一提的是,对例程工程进行编译,发现例程中的工程编译后是0警告,而自己移植后的工程编译出现了8个警告,明明是相同的文件,怎么会这样呢?参考:keil中忽略特定警告的方法,例程工程将警告全部忽略掉了。

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

移植中的启动文件和sct文件对比源码的例程工程并没有进行大幅度的修改简化,保证程序运行的稳定性。但是这两个文件相比较于裸机工程修改的幅度还是很大的,sct文件添加了若干个加载域进行分散加载,启动文件也进行了大规模的修改,以后有机会进行深入的分析,在本文中则不进行讨论,因为涉及到的知识范围太大了。本文侧重于移植的有效性。

(之前我也尝试过不使用例程工程给的这两个文件,自己来编写,能力有限,实在是办不到,浪费了很多时间,太打击了)

在例程工程中的启动文件中,与裸机的启动文件不同,使用符号"Image$$ARM_LIB_STACKHEAP$$Base",合并的堆栈/堆区的方法,对堆栈进行划分,并定义了了LOS_HEAP_ADDR_END和LOS_HEAP_ADDR_START两个地址变量。而原来的启动文件是将堆栈分开进行设置的。另外,例程工程中的启动文件将中断向量表省略,改成了"boot向量表",缩减了很多,只存有栈指针和Reset_Handler,而将其他的中断向量成员的定义工作完成在"los_hwi.c"文件中,因此sct也随之变动。本人觉得这里相比于ucos实在是麻烦的多,不知道为什么要这么修改。

启动文件的代码如下: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

}

}

5.  完善main()函数

内核代码移植完毕后,main()函数就可以跑起来了。贴出用来测试的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;

}

}

实验结果可以看到灯blingbling的闪,闪~闪~闪~

至此,移植工作及测试全部结束。

野火Linux开发板接入华为云,Huawei_LiteOS——STM32F1移植(野火开发板)相关推荐

  1. 教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发)

    教你如何使用esp8266接入华为云物联网平台(IOTDA)(Arduino IDE开发) 一.简介         esp8266系列作为低功耗高性价比的嵌入式无线网络控制模块,深受对嵌入式感兴趣的 ...

  2. 合宙Air780e+luatos接入华为云物联网平台完成设备通信与控制

    一.简介 1.项目介绍 之前发布的文章有esp8266的wifi模块和BC20的NB模块与华为云物联网通信为主,本期文章采用了合宙的4G LTE Cat.1模块,编程语言用的是lua,整体来说代码比较 ...

  3. 【伙伴故事】智慧厨电接入华为云+HarmonyOS,你的未来厨房长这样

    摘要:国内集成灶的头部企业-火星人,正是通过华为云IoT接入HarmonyOS生态,打造云端智慧厨房的整体解决方案,为我们描绘出一副未来厨房新趋势的蓝图. 本文分享自华为云社区<[伙伴故事]智慧 ...

  4. 华为云HMS Core 助力鸿蒙开发

    前言 今天看了一期 华为云 HMS Core 助力鸿蒙开发的视频.内容干货满满.下面就视频的内容做一下学习记录. 名词说明 文中涉及到的相关名词 鸿蒙OS == HarmonyOS HarmonyOS ...

  5. 华为云IOT的应用侧开发Java Demo使用详细教程(IntelliJ IDEA 开发)

    第0章 简介         最近有很多小伙伴在使用华为云IOT的应用侧开发的Java Demo时遇到一些问题,本期就教大家如何使用这个基于华为云官方提供的Java Demo,本期教程带大家做的是查询 ...

  6. stm32+AT指令+ESP8266接入华为云物联网平台并完成属性上报与命令响应

    (示例:stm32f103c8t6+esp01s串口AT指令模式) 流程简介: 一. MQTT透传AT固件烧录 本期教程使用的是stm32+AT指令控制esp01s接入华为云联网平台完成数据上报与命令 ...

  7. ESP8266通过AT指令接入华为云物联网平台

    1. esp8266 MQTT固件烧录 在先前如果使用Arduino开发过后的esp8266可能已经无法使用AT指令,或者出厂固件不支持全部的MQTT功能,这里我们首先对esp8266进行MQTT固件 ...

  8. 台式linux桌面远程链接华为云windows服务器桌面

    需求如题: 台式linux桌面远程链接华为云windows服务器桌面 linux(centos)里面安装 remmina软件 sudo yum install remmina 第一步:打开remmin ...

  9. springboot接入华为云短信

    #记一次接入华为云短信 几个月前,也就是公司网站第一个版本上线的时候,当时有业务需要短信验证,于是购买了华为云的短信业务.在此简单的记录一下华为云短信api的接入,比较简单,拿来就可以用这里我首先定义 ...

最新文章

  1. 样式集(六)仿微信通讯录样式
  2. python index函数时间复杂度_初学python之以时间复杂度去理解列表常见使用方法
  3. my sql Group_concat函数
  4. 数字转字符函数_Excel之文本函数CONCATENATE/TEXT/LEFT/MID/RIGHT/FIND/LEN
  5. 全球如何保证区块生成是匀速的?
  6. 常数除以0的极限是什么_【极限】第四节 极限运算法则
  7. Pycharm运行项目代码时输入可选参数
  8. 环境变量的配置导致无法登录
  9. C#中xml序列化域反序列化
  10. 带aidl文件的应用程序在android平台源码中的编译
  11. ckplayer 解决flash全屏遮住了div元素,重写全屏/退出全屏方法
  12. .native.prevent是什么意思?
  13. android 平板分辨率是多少合适,为什么越来越多的平板放弃16:9的屏幕比例?
  14. 百度地图多标注显示以及自定义图标
  15. 微信小程序 java校友录交流系统springboot
  16. python脚本修改hosts文件
  17. 2022-2028年全球与中国全轮驱动(AWD)系统行业深度分析
  18. 关于宋词频率统计(R语言)
  19. Windows下Armadillo配置及测试
  20. 偶然获得京东内推,四面之后成功拿下offer

热门文章

  1. 牛客网(剑指offer) 第二十二题 从上往下打印二叉树
  2. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解
  3. [LeetCode] Isomorphic Strings - 字符串操作:数组计数字符个数问题
  4. OpenGL ES之GLKit的使用功能和API说明
  5. OpenGL之控制渲染图形的移动
  6. Linux下多窗口分屏式终端--Terminator
  7. C语言register关键字——最快的关键字
  8. 【Linux】一步一步学Linux——umask命令(111)
  9. 两个多精度十进制数加法程序设计_初中数学之有理数的加减,学会加法,减法即会,掌握技巧轻松计算...
  10. c语言图片见水印,[求助]C语言 bmp文件加上水印