返回

打造智慧社区生态小熊派,手把手教你移植华为 LiteOS-M

闲谈

引言

智慧社区建设正蓬勃发展,作为物联网的重要组成部分,小熊派凭借其小巧便携、价格实惠、性能优异等特点,成为智慧社区建设的理想选择。华为 LiteOS-M 作为一款轻量级、低功耗的物联网操作系统,也非常适合在小熊派上运行。

本文将详细讲解如何将华为 LiteOS-M 移植到小熊派,帮助您轻松创建智慧社区生态,打造更智能、更安全、更便捷的生活空间。从环境搭建、代码配置到系统移植,本文将为您提供一步步的指导,让您能够快速掌握移植技巧,为智慧社区建设贡献力量。

环境搭建

1. 硬件准备

  • 小熊派一块
  • Micro USB 数据线一根
  • TF 卡(容量不低于 4GB)一张
  • SD 卡读卡器一个(可选)
  • 电脑一台

2. 软件准备

  • Windows 操作系统(版本不低于 Windows 7)
  • MDK 软件包(版本不低于 MDK-ARM 5.25)
  • 华为 LiteOS-M 源码包(版本不低于 LiteOS-M V100R001C00)
  • Keil MDK 编译环境(版本不低于 MDK 5.25)
  • PackInstaller 软件包(版本不低于 PackInstaller 4.6.1)

代码配置

1. 获取 LiteOS-M 源码

从华为官方网站下载 LiteOS-M 源码包,解压缩后得到源码目录。

2. 配置 MDK 工程

打开 MDK 软件,新建一个工程,并选择 "Cortex-M3" 作为目标芯片。

在工程目录下创建 "src" 和 "inc" 两个子目录,分别存放源代码和头文件。

将 LiteOS-M 源码包中的 "src" 和 "inc" 子目录复制到工程目录下的相应子目录中。

在工程目录下创建 "startup_nrf51822.s" 文件,并复制以下内容:

;----------------------------------------------------------------------------
; File Name    : startup_nrf51822.s
; Purpose      : CMSIS Core Peripheral Access Layer Source File for Startup
;                Code
;
;----------------------------------------------------------------------------
.include "nrf51_peripherals.inc"

/*----------------------------------------------------------------------------
  Linker generated Symbols
 *----------------------------------------------------------------------------*/
extern __initial_sp
extern __stack_end

/*----------------------------------------------------------------------------
  Exception / Interrupt Handler Function Prototype
 *----------------------------------------------------------------------------*/
extern void Reset_Handler      (void)  __attribute__ ((weak, alias ("Default_Reset_Handler")));
extern void NMI_Handler        (void)  __attribute__ ((weak, alias ("Default_NMI_Handler")));
extern void HardFault_Handler  (void)  __attribute__ ((weak, alias ("Default_HardFault_Handler")));
extern void SVC_Handler        (void)  __attribute__ ((weak, alias ("Default_SVC_Handler")));
extern void PendSV_Handler    (void)  __attribute__ ((weak, alias ("Default_PendSV_Handler")));
extern void SysTick_Handler   (void)  __attribute__ ((weak, alias ("Default_SysTick_Handler")));
extern void POWER_CLOCK_IRQHandler (void)  __attribute__ ((weak, alias ("Default_POWER_CLOCK_IRQHandler")));
extern void RADIO_IRQHandler   (void)  __attribute__ ((weak, alias ("Default_RADIO_IRQHandler")));
extern void UARTE0_UART0_IRQHandler (void)  __attribute__ ((weak, alias ("Default_UARTE0_UART0_IRQHandler")));
extern void SPI0_TWI0_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SPI0_TWI0_IRQHandler")));
extern void SPIS0_TWIS0_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SPIS0_TWIS0_IRQHandler")));
extern void NFC_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_NFC_IRQHandler")));
extern void GPIOTE_IRQHandler  (void)  __attribute__ ((weak, alias ("Default_GPIOTE_IRQHandler")));
extern void SAADC_IRQHandler   (void)  __attribute__ ((weak, alias ("Default_SAADC_IRQHandler")));
extern void TIMER0_IRQHandler  (void)  __attribute__ ((weak, alias ("Default_TIMER0_IRQHandler")));
extern void TIMER1_IRQHandler  (void)  __attribute__ ((weak, alias ("Default_TIMER1_IRQHandler")));
extern void TIMER2_IRQHandler  (void)  __attribute__ ((weak, alias ("Default_TIMER2_IRQHandler")));
extern void RTC0_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_RTC0_IRQHandler")));
extern void TEMP_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_TEMP_IRQHandler")));
extern void RNG_IRQHandler     (void)  __attribute__ ((weak, alias ("Default_RNG_IRQHandler")));
extern void ECB_IRQHandler     (void)  __attribute__ ((weak, alias ("Default_ECB_IRQHandler")));
extern void CCM_AAR_IRQHandler (void)  __attribute__ ((weak, alias ("Default_CCM_AAR_IRQHandler")));
extern void WDT_IRQHandler     (void)  __attribute__ ((weak, alias ("Default_WDT_IRQHandler")));
extern void RTC1_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_RTC1_IRQHandler")));
extern void QDEC_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_QDEC_IRQHandler")));
extern void COMP_IRQHandler    (void)  __attribute__ ((weak, alias ("Default_COMP_IRQHandler")));
extern void SWI0_EGU0_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI0_EGU0_IRQHandler")));
extern void SWI1_EGU1_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI1_EGU1_IRQHandler")));
extern void SWI2_EGU2_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI2_EGU2_IRQHandler")));
extern void SWI3_EGU3_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI3_EGU3_IRQHandler")));
extern void SWI4_EGU4_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI4_EGU4_IRQHandler")));
extern void SWI5_EGU5_IRQHandler (void)  __attribute__ ((weak, alias ("Default_SWI5_EGU5_IRQHandler")));

/*----------------------------------------------------------------------------
  Exception / Interrupt Vector table
 *----------------------------------------------------------------------------*/
__attribute__ ((section(".isr_vector")))
const unsigned long __vector_table[] =
{
  (unsigned long)__initial_sp,           /*     Initial Stack Pointer     */
  (unsigned long)Reset_Handler,          /*     Reset Handler            */
  (unsigned long)NMI_Handler,            /*     NMI Handler              */
  (unsigned long)HardFault_Handler,      /*     Hard Fault Handler        */
  (unsigned long)MemManage_Handler,      /*     Memory Management Handler */
  (unsigned long)BusFault_Handler,       /*     Bus Fault Handler         */
  (unsigned long)UsageFault_Handler,     /*     Usage Fault Handler       */
  0,                                    /*     Reserved                  */
  0,                                    /*     Reserved                  */
  0,                                    /*     Reserved                  */
  0,                                    /*     Reserved                  */
  (unsigned long)SVC_Handler,            /*     SVCall Handler            */
  (unsigned long)DebugMon_Handler,       /*     Debug Monitor Handler     */
  0,                                    /*     Reserved                  */
  (unsigned long)PendSV_Handler,        /*     PendSV Handler            */
  (unsigned long)SysTick_Handler,       /*     SysTick Handler           */

  /* External interrupt handlers follow */
  (unsigned long)POWER_CLOCK_IRQHandler, /*     POWER_CLOCK              */