Huawei_LiteOS——STM32F1移植(野火開發板)

      網友投稿 961 2022-05-30

      硬件環境:秉火STM32F1

      軟件環境:Keil 5

      Huawei_LiteOS——STM32F1移植(野火開發板)

      Huawei_LiteOS Version:2018.11.21

      源代碼-:

      github:https://github.com/LiteOS/LiteOS

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

      rar:https://download.csdn.net/download/sinat_27066063/10809185

      1.? 源碼文件及目錄介紹

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

      /arch /arm /arm-m? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??M核中斷、調度、tick相關代碼

      /common? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?arm核公用的cmsis core接口(這個可以在keil直接設置)

      /components /cmsis? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??LiteOS提供的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 /core? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? LiteOS基礎內核代碼,包括隊列、task調度、軟timer、時間片計算等功能

      /om? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??與錯誤處理相關的文件

      /include? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LiteOS內核內部使用的頭文件

      /ipc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??LiteOS中task間通訊的相關接口,包括事件、信號量、消息隊列、互斥鎖等

      /mem? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LiteOS中的內核內存管理的相關代碼

      /misc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?內存對齊功能以及毫秒級休眠sleep功能

      /extended /tickless? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?低功耗框架代碼

      /include? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?LiteOS開源內核頭文件

      /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的閃,閃~閃~閃~

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

      Huawei_LiteOS STM32F103

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:【Kubernetes系列】第4篇 Kubernetes集群安裝部署
      下一篇:Python操作SQLite/MySQL/LMDB/LevelDB
      相關文章
      亚洲综合久久成人69| 国产亚洲成av片在线观看| 久久久亚洲精品无码| 2048亚洲精品国产| 国产精品亚洲片在线花蝴蝶| 亚洲熟妇丰满xxxxx| 亚洲中文字幕一二三四区苍井空| 亚洲激情校园春色| 久久精品国产亚洲av麻豆小说| 久久久久亚洲AV成人无码| 亚洲高清国产拍精品26U| 国产精品国产亚洲精品看不卡| 亚洲人成77777在线播放网站| 国产成人精品久久亚洲高清不卡 | 亚洲区不卡顿区在线观看| 亚洲视频在线一区二区| 亚洲香蕉网久久综合影视| 亚洲国产精品无码专区| 亚洲bt加勒比一区二区| 337p欧洲亚洲大胆艺术| 亚洲大香人伊一本线| 久久精品国产亚洲AV久| 亚洲午夜成人精品无码色欲| 亚洲精品无码mⅴ在线观看 | 亚洲欧美中文日韩视频| 亚洲日韩精品国产3区| 亚洲AV日韩AV永久无码色欲| 亚洲av乱码一区二区三区按摩 | 亚洲欧美国产精品专区久久| 鲁死你资源站亚洲av| 亚洲福利精品电影在线观看| 在线亚洲精品自拍| 日韩亚洲一区二区三区| 亚洲视频在线观看免费视频| 亚洲一区电影在线观看| 亚洲日本在线电影| 亚洲成片观看四虎永久| 亚洲精品国产精品乱码视色| 亚洲午夜视频在线观看| 亚洲伦理一二三四| 亚洲AV永久无码天堂影院|