日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

给STM32装点中国风——华为LiteOS移植

發布時間:2023/11/6 C# 73 coder
生活随笔 收集整理的這篇文章主要介紹了 给STM32装点中国风——华为LiteOS移植 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  我都二手程序員好幾個禮拜了!想給我的STM32來點“中國風”,裝個華為LiteOS操作系統。

 
  在此之前,我也試過STM32CubeMX自帶的FreeRTOS操作系統,不知是何緣故,用F103c8t6芯片時,FreeRTOS里的一個斷言過不去。出師不利,決定換LiteOS試試,盡管移植LiteOS有些麻煩,不如STM32CubeMX生成的方便,但是,移植成功后,編譯沒有問題、運行也沒有問題,這讓我這個初學者增添了不少信心。

 
  FreeRTOS與LiteOS孰優孰劣,我真的不知道,不過,我知道我喜歡CubeMX,Keil也算湊活,所以,想用大白話說說,如何給STM32CubeMX創建的MDK-ARM工程移植LiteOS。如果,你也想用華為LiteOS操作系統,可以繼續往下看,若是內行高手,“要是你拿正眼多看我一眼,那你就輸了”。

 

一、 準備一個STM32CubeMX工程

  沒什么特殊要求,注意以下兩點:一、SYS 時鐘源不要用SysTick。二、項目管理中Toolchain選擇MDK-ARM。

 

二、 LiteOS源碼去那里找

  • 在這里Huawei LiteOS/LiteOS - 碼云 - 開源中國 (gitee.com)

  上面給的鏈接不是最新發行版,新版本增加了些芯片架構的支持,暫時還不會用。先來個打了標簽LiteOSV200R001C50B038的版本。下圖中紅框標注的4個目錄是我們需要的。

 

三、 把LiteOS源碼拷貝到咱的Keil工程目錄下

  LiteOS源碼下載好了吧?我們開始給Keil工程添加LiteOS源碼。

  1. 先在Keil工程根目錄下,建一個目錄LiteOS,用來放置LiteOS的源碼,(其實目錄名叫什么不重要,看你高興)。

  2. 在新建的LiteOS目錄下,再整4個子目錄,分別叫它們KernelArch、CMSIS、Config。看看它們的名字,想必您已經猜到了,我想在里面放些什么了,對嘍,就是圖1中那4個目錄所對應的內容。

  3. 怎么復制源碼呢?是不是這個姿勢...

  不必這樣,按照下面的圖片復制就好。

  • 首先,Kernel目錄

      把LiteOS源碼中kernel目錄下的內容全部復制到工程里的 .\LiteOS\Kernel目錄下,然后再把.\LiteOS\Kernel\base\mem目錄下的兩個子目錄bestfittlsf刪除。

  • 接下來是Arch目錄

  從LiteOS源碼arch\arm\arm-m中復制兩個目錄src、include到工程.\LiteOS\Arch目錄下。

  然后,根據你的STM32芯片的具體架構(cortex-m3或cortex-m4 ??),選擇復制arch\arm\arm-m\contex-m?\keil\los_dispatch_keil.S到工程.\LiteOS\Arch目錄下。下圖,我的芯片是Cortex-m3的。

  復制好以后,Arch目錄長這樣。

  • 現在是,CMSIS目錄

  這個目錄下是與操作系統供應商無關的抽象層,復制LiteOS源碼osdepends\liteos\cmsis目錄中的文件到工程目錄.\LiteOS\CMSIS目錄下。

  • 最后,復制Config目錄

?  這個目錄下應放置和你芯片相匹配的配置文件,咱們先去LiteOS源碼的targets目錄下找一個合適的,然后把它里面OS_Config目錄下的頭文件(.h 文件),復制到工程的.\LiteOS\Config目錄下。

  復制好以后,我的Config目錄是這個樣子的。

 

四、 在Keil工程中添加分組(Groups)

在Keil的IDE環境中,分別添加以下4個分組:

  • LiteOS/Kernel
  • LiteOS/Arch
  • LiteOS/CMSIS
  • LiteOS/Config

在LiteOS/Kernel分組下,我們添加上面復制在..\LiteOS\Kernel目錄下(包含子目錄下)的所有.c的源文件。

在LiteOS/Arch分組下,添加..\LiteOS\Arch目錄下(包含子目錄下)所有.c的源文件,還不夠,還有那個名為los_dispatch_keil.S的匯編源文件也得添加。

在LiteOS/CMSIS分組下,添加..\LiteOS\CMSIS目錄下的cmsis_liteos.c。

在LiteOS/Config分組下,添加..LiteOS\Config目錄下的所有.h的頭文件,其實,這個分組不建,程序照樣能跑,但是,為了以后修改參數方便,我們還是先安排上吧。

 

五、 給Keil工程添加頭文件引用路徑

  添加內容如下:

../LiteOS/Arch/include

../LiteOS/Kernel/include

../LiteOS/Kernel/base/include

../LiteOS/Kernel/extended/include

../LiteOS/Config

../LiteOS/CMSIS

 

六、 注釋掉STM32生成的兩個中斷處理函數(PendSV_Handler、SysTick_Handler)

  它們倆藏在一個叫stm32f?xx_it.c的文件中, 注釋掉就好。

 

七、 修改配置

  記得前面創建的Keil工程分組LiteOS/Config分組嗎?配置參數就藏在這兒。

  分組中有個叫target_config.c文件,你可以根據使用的芯片,在這修改一下#define BOARD_SRAM_SIZE_KB 40參數,據說,該值應該比芯片實際的SRAM略小。

  其它的參數,在實際開發過程中,慢慢研究調整吧。我讀書少,更多的內容也搞不清楚。

  到這里,LiteOS的移植工作算是差不多了,接下來,點一盞燈,驗證一下"來時的路"。

 

八、 一燈大師,發功了

  1. 在main.c 引入頭文件

    #include "cmsis_os.h"

  2. 在main.c 申明倆個變量

    /* Private variables ---------------------------------------------------------*/
    
    /* USER CODE BEGIN PV */
    osThreadId_t default_taskHandle;
    const osThreadAttr_t default_task_attributes = {
    	.name = "default_task",
    	.stack_size = 512 * 4,
    	.priority = (osPriority_t) osPriorityNormal,
    };
    /* USER CODE END PV */
    
  3. 在main.c 申明兩個函數

    /* USER CODE BEGIN PFP */
    /* LITEOS BEGIN PFP */
    void StartDefaultTask(void *argument);
    void LiteOS_Init(void);
    /* LITEOS END PFP */
    /* USER CODE END PFP */
    
    
  4. 在main.c中,實現上面的函數

    /* Private user code ---------------------------------------------------------*/
    /* USER CODE BEGIN 0 */
    void LiteOS_Init(void)
    {
        osKernelInitialize();	
        default_taskHandle = osThreadNew(StartDefaultTask, NULL, &default_task_attributes);	
    }
    
    void StartDefaultTask(void *argument)
    {
        while(1)
        {		
     	   /*  一燈大師,請試試在這里點一盞燈。  */
     	   HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
     	   osDelay(200);
        }
    }
    /* USER CODE END 0 */
    
  5. 在main.c中, int main(void)函數體里調用

       /* USER CODE BEGIN 2 */
    	   LiteOS_Init();	
    	   osKernelStart(); //注意,這東西要在main的while之前
    	
         /* USER CODE END 2 */
         /* Infinite loop */
         /* USER CODE BEGIN WHILE */
         while (1)
         {
           /* USER CODE END WHILE */
       
           /* USER CODE BEGIN 3 */
         }
         /* USER CODE END 3 */
    

    燈亮了嗎?祝您成功!

 

九、 手搓 LiteOS移植工具

  寫到這兒,不知道我講清除了沒有。還不行的話,我準備了一個手搓移植工具,要不您也試試。

  我把它放這兒了,Python實現,有源碼,改改給Makefile工程移植應該也行。它長下面這副德行:

  • LiteOS移植完成后,如果再次點擊STM32CubeMX中的GENERATE CODE按鈕,會把工具注釋掉的兩個中斷處理函數恢復出來,這時需要您手工注釋掉它們。PendSV_HandlerSysTick_Handler 他們在..\Core\Src\stm32f?xx_it.c文件中?;蛘?,也可以再次點擊工具中的開始移植按鈕,也能注釋掉它們。

  • 根據實際情況設置LiteOS的BOARD_SRAM_SIZE_KB參數, 這個值應略小于芯片的SRAM,LiteOS配置文件位于LiteOS\Config分組下的target_config.h文件中,約在283行處 #define BOARD_SRAM_SIZE_KB 40。 本工具定義了一些芯片的SRAM設置尺寸,由于個人能力問題,它們既不全面,也不準確。(工具中關于芯片配置定義,見stm32.py中的枚舉類class STM32

總結

以上是生活随笔為你收集整理的给STM32装点中国风——华为LiteOS移植的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。