返回
打造智慧社区生态小熊派,手把手教你移植华为 LiteOS-M
闲谈
2023-12-09 07:59:12
引言
智慧社区建设正蓬勃发展,作为物联网的重要组成部分,小熊派凭借其小巧便携、价格实惠、性能优异等特点,成为智慧社区建设的理想选择。华为 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 */