HarmonyOS(LiteOs_m) 官方例程移植到STM32初體驗
HarmonyOS(LiteOs_m) 官方例程移植到STM32初體驗
硬體平臺
基於正點原子戰艦V3開發板
MCU:STM32F103ZET6
片上SRAM大小:64KBytes
片上FLASH大小:512KBytes
移植準備
IDE軟體:Keil MDK5
串列埠除錯助手
原始碼下載
HarmonyOS原始碼開源在gitee上
LiteOS_m的原始碼倉庫
原始碼結構
根資料夾下的arch_spec.md檔案內容即原始碼結構樹,但該結構樹不是最新,可以看到當前targers資料夾下已經添加了對STM32F1微控制器的例程,但該結構樹中並未列出
. ├── components --- 可選元件,可裁剪,依賴kernel │ ├── cppsupport --- C++支援 │ └── cpup --- CPUP功能 ├── kal --- 核心抽象層 │ ├── cmsis --- cmsis標準支援 │ └── posix --- posix標準支援 ├── kernel --- 核心最小功能集支援 │ ├── arch --- 硬體架構相關 │ │ ├── arm --- arm32架構 │ │ │ └── cortex-m4 --- cortex-m4架構 │ │ │ └── iar --- │ │ │ ├── los_atomic.h │ │ │ ├── los_context.h │ │ │ ├── los_interrupt.h │ │ │ └── los_mpu.h │ │ └── include │ │ ├── los_arch_atomic.h --- 定義通用arch的原子操作 │ │ ├── los_arch_context.h --- 定義通用arch的上下文切換 │ │ ├── los_arch.h --- 定義通用arch初始化 │ │ └── los_arch_interrupt.h --- 定義通用arch中斷 │ ├── include │ │ ├── los_config.h --- 功能開關和配置引數 │ │ ├── los_event.h --- 事件 │ │ ├── los_liteos.h --- liteos最小功能集對外提供的標頭檔案 │ │ ├── los_memory.h --- 堆記憶體管理 │ │ ├── los_mutex.h --- 互斥鎖 │ │ ├── los_queue.h --- 佇列 │ │ ├── los_scheduler.h --- 排程演算法 │ │ ├── los_sem.h --- 訊號量 │ │ ├── los_task.h --- 任務 │ │ └── los_timer.h --- 定時器 │ └── src ├── targets │ └── targets │ └── cortex-m4_stm32f429ig_fire-challenger_iar │ ├── board │ ├── dprintf.c │ ├── Libraries │ ├── main.c │ ├── project │ ├── target_config.h --- 板級配置功能開關和配置引數 │ └── Utilities └── utils ├── include │ ├── los_compiler.h --- 編譯工具配置,型別定義 │ ├── los_debug.h --- debug,printf相關 │ ├── los_error.h --- 錯誤定義 │ └── los_list.h └── src
啟動流程
在\targets\cortex-m3_stm32f103_simulator_keil\project資料夾下開啟工程檔案(los_demo.uvproj)
工程下有三個資料夾:liteos-m、main、component
程式載入時,首先進入liteos-m下的los_startup.s檔案,內容如下
PRESERVE8 AREA RESET, CODE, READONLY THUMB IMPORT ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit|| IMPORT HalHwiDefaultHandler EXPORT _BootVectors EXPORT Reset_Handler _BootVectors DCD ||Image$$ARM_LIB_STACKHEAP$$ZI$$Limit|| DCD Reset_Handler DCD HalHwiDefaultHandler DCD HalHwiDefaultHandler Reset_Handler CPSID I IMPORT LOS_HardBootInit BL LOS_HardBootInit IMPORT __main LDR R0, =__main BX R0 ALIGN END
可以看出,啟動檔案只定義了啟動向量和reset向量,其他的向量在los_interrupt.c中動態載入
通過LOS_HardBootInit跳轉到系統硬體初始化程式碼,對Uart進行初始化(該例程只用到了串列埠)
void LOS_HardBootInit()
{
UINT32 uwRet = LOS_OK;
uwRet = LOS_UartBaseInit();
if (uwRet != LOS_OK)
{
return ;
}
return ;
}
初始化後回到啟動檔案並跳轉到main函式:
LITE_OS_SEC_TEXT_INIT int main(void) { unsigned int ret; //USART_Config(); printf("\n\rhello world!!\n\r"); ret = LOS_KernelInit(); taskSample(); if (ret == LOS_OK) { LOS_Start(); } while (1) { __asm volatile("wfi"); } }
main函式開始進行了hello world列印,並進行了核心的初始化,最後進行程序測試,建立並執行兩個程序
移植需要的修改
工程中使用自定義.sct檔案對各個區進行分散載入,詳細載入檔案見\targets\cortex-m3_stm32f103_simulator_keil\project\los_demo.sct(注意路徑,不是output資料夾下的.sct檔案,keil在編譯過程中也會產生一個.sct檔案),詳細內容如下:
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address
los_startup.o (RESET, +First)
*(InRoot$$Sections)
* (+RO)
}
RW_IRAM1 0x20000000 0x00200000 { ; RW data
* (.data, .bss, .data.init)
}
VECTOR 0x20200000 0x400 ; Vector
{
* (.vector)
}
ARM_LIB_STACKHEAP 0x08100000 EMPTY 0x1000
{
}
}
由於片內SRAM和FLASH大小等因素,各段對映地址需要進行相應調整,我修改的對映地址如下(個人習慣):
LR_IROM1 0x08000000 0x00080000 { ; 載入域FLASH起始地址0x08000000 大小0x00080000(512KBytes)
ER_IROM1 0x08000000 0x00080000 { ; 從FLASH中載入程式,所以將程式啟動檔案定向到FLASH首地址,其它只讀欄位也定位到這裡
los_startup.o (RESET, +First)
*(InRoot$$Sections)
* (+RO)
}
RW_IRAM1 0x20000000 0x00010000 { ; SRAM起始地址0x20000000 大小0x00010000(64KBytes),其它讀寫段和未初始化變數均定位到SRAM中
* (.data, .bss, .data.init)
}
VECTOR 0x2000E000 0x1000 ; 向量表地址
{
* (.vector)
}
ARM_LIB_STACKHEAP 0x20010000 EMPTY -0x1000 ;堆疊空間,存放在記憶體的高地址向下的一段空間,大小0x1000(4KBytes)
{
}
}
由於SRAM記憶體限制,需要修改OS記憶體池大小
修改位置為\targets\cortex-m3_stm32f103_simulator_keil\target_config.h檔案中的OS_SYS_MEM_SIZE巨集定義,將記憶體池大小減小,我將其修改為了0x00000D000(52KBytes)
編譯執行
將輸出檔案下載進MCU,連線串列埠波特率設定115200即可輸出helloworld資訊和程序執行資訊