天天看點

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

軟體環境:Keil 5

Huawei_LiteOS Version:2018.11.21

源代碼下載下傳位址:

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

1.  源碼檔案及目錄介紹

如圖所示,源碼共有6個目錄,移植需要使用到的代碼在下面用紅色标記:

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

/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"。

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)
野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

main.c檔案中的main()函數暫時先不做任何工作。最後在工程中添加所有使用到的頭檔案的目錄。

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

工程選項中勾選C99mode,否則有些文法編譯時無法通過。

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

target_config.h檔案的頭檔案中,将#include "stm32f1xx.h"更改為#include "stm32f10x.h"。

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

在完成上面的工作後,編譯會生成兩個錯誤:

野火Linux開發闆接入華為雲,Huawei_LiteOS——STM32F1移植(野火開發闆)

值得一提的是,對例程工程進行編譯,發現例程中的工程編譯後是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的閃,閃~閃~閃~

至此,移植工作及測試全部結束。