久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5957|回復: 4
收起左側

UCOSII快速移植教程

[復制鏈接]
ID:102668 發表于 2016-1-11 05:08 | 顯示全部樓層 |閱讀模式
前言
本教程是基于STM32F103RBT6基礎工程進行移植,同系列的stm32同樣適用,只不過基礎工程要另外準備,其中本教程使用到的基礎工程里面有個SYSTEM的文件夾(如果使用其他工程建議可以把該文件夾復制過去使用),里面的函數是由正點原子團隊提供,這里也是參考原子出品的“STM32F1UCOS開發手冊”,想了解更加具體的教程可以自己去網上搜一下。這是stm32學習論壇,里面有豐富的學習資源。
本教程使用到的文件:工程文件與word;  訪問密碼:912b(如果你準備按照該教程進行移植,開始之前請先下載該文件,鏈接失效可以評論回復,看到后會處理)注意:請使用MDK5打開工程!
1、準備工作
        1stm32F103RBT6基礎工程:這里以跑馬燈為例
        2UCOSII源碼:官網下載
        3)準備文件:PORTCONFIG

2、移植
        1)在基礎工程中建立新文件夾用來存放源碼:

    (2)向三個文件夾添加UCOSII源碼,首先向CORE文件夾添加(UCOSII源碼):


至于為什么不要那兩個文件,后續再談,先照著做。
然后向CONFIG文件夾添加文件:將“準備工作”里面“必需文件”下的CONFIG全部復制到這里來:

其中includes.h里面定義了一些頭文件,如圖,:


os_cfg.h主要用來配置和裁剪UCOSII的。
最后是向PORT文件夾添加文件,如上所述,直接將“必需文件”下的PORT直接復制過來:

這里的文件是關鍵,移植需要修改幾乎都在這里,因為這里PORT下的文件已經是修改好的,下一步添加到工程時不用再修改就能在stm32上跑,這里后續再講,先移植好一個成功的工程先。
3)配置工程

        a 我們打開基礎工程,將UCOSII添加到工程里面:




添加成功后:
別忘了添加路徑:

b 編譯工程,處理錯誤
        上面步驟成功之后,現在可以編譯工程了,

   提示打不開“app_cfg.h”文件,跟蹤錯誤:

再重新編譯一下,

發現錯誤,重復定義了,我們stm32f10x_it.h里面的注釋掉:

這時候編譯,發現工程已經沒有錯誤了,因為我們是引用了正點原子提供的system函數,所以還要按照他們的規則去修改一下一些文件。
c 修改sys.h頭文件
        打開sys.h
因為
system
里面的文件適用于裸板也適用移植了操作系統的,所以宏定義要按需更改。
             再編譯,提示
”TRUE”
沒有定義,把
”TRUE”
改為“
OS_TRUE
”,再編譯:
同理,將stm32f10x.h里面的注釋掉:

再編譯,這時候發現已經沒有錯誤了:

如果還有錯誤,請根據錯誤提示自行解決。
如此,UCOSII就已經移植完成了,下面寫個個測試程序看看能不能成功即可。
d 測試是否移植成功,
程序:(將下面代碼直接復制到main函數里面,原先的都刪掉,編譯,下載驗證,如果LED0LED1以不同的頻率閃爍說明移植成功)
#include"led.h"
#include"delay.h"
#include"sys.h"
#include"usart.h"
#include"includes.h"
//開始任務
#defineSTART_TASK_PRIO                    10
#defineSTART_STK_SIZE                128
OS_STKSTART_TASK_STK[START_STK_SIZE];
void start_task(void*pdata);
//LED0任務
#defineLED0_TASK_PRIO               7
#defineLED0_STK_SIZE                  64
OS_STKLED0_TASK_STK[LED0_STK_SIZE];
void led0_task(void*pdata);
//LED1任務
#defineLED1_TASK_PRIO               6
#defineLED1_STK_SIZE                  64
OS_STKLED1_TASK_STK[LED1_STK_SIZE];
void led1_task(void*pdata);
intmain(void)
{
      delay_init();      
      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      uart_init(115200);   
      LED_Init();
      OSInit();            //UCOSII初始化
      OSTaskCreate(start_task,(void*)0,(OS_STK*)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO);//創建開始任務
      OSStart();    //系統啟動
}
void start_task(void*pdata)
{
      OS_CPU_SRcpu_sr=0;
      pdata=pdata;
      OSStatInit();
      OS_ENTER_CRITICAL();  //臨界
      OSTaskCreate(led0_task,(void*)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);//創建LED0任務
      OSTaskCreate(led1_task,(void*)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);//創建LED1任務
      OSTaskSuspend(START_TASK_PRIO);//開始任務掛起
      OS_EXIT_CRITICAL();
}
//LED0任務
void led0_task(void*pdata)
{
      while(1)
      {
             GPIO_ResetBits(GPIOA,GPIO_Pin_8);
             delay_ms(80);
             GPIO_SetBits(GPIOA,GPIO_Pin_8);
             delay_ms(80);
      }
}
//LED1任務
void led1_task(void*pdata)
{
      while(1)
      {
             GPIO_ResetBits(GPIOD,GPIO_Pin_2);
             delay_ms(300);
             GPIO_SetBits(GPIOD,GPIO_Pin_2);
             delay_ms(300);
      }
}

3 移植過程講解
1)如果參考上面的步驟你已經完成了系統的移植的話,接下來講解一下移植過程中主要需要修改的文件,首先是os_cpu_a.asm,前面已經說過這些需要修改的文件都是官方提供的代碼,我們只需要根據自身的硬件體系結構進行修改即可:
os_cpu_a.asm主要是一些匯編代碼,我們在工程中打開,主要關注的是這幾個函數:
                 EXPORT的意思這些函數在本文件定義供其他文件調用。
a OSStartHighRdy函數
OSStartHighRdy是由OSStart()函數調用的,這是第一個任務,用來開啟多任務,多任務開啟失敗的話調用OSStartHang函數。需要移植的原因是這里的寄存器都要根據STM32的結構來進行修改,這里已經是修改好了的。
bOSCtxSw函數和OSIntCtxSw函數
兩個函數都是用來做任務切換,區別在于OSCtxSw是任務級,OSIntCtxSw是中斷級切換。OSCtxSw函數在 OSSched函數中負責保存當前任務對應的處理器寄存器到堆棧中,并將任務中需要恢復的處理器寄存器從堆棧中恢復出來。OSIntCtxSw函數主要保存當前任務堆棧指針,并將新任務對應的處理器寄存器從堆棧中恢復出來。


這里也是已經移植好了的。其他的都可以暫時先不用理會。
2)移植os_cpu.h

      os_cpu.h主要定義了一些數據類型,μCOS-II為了保證可移植性,程序中沒有直接使用 intunsignedint 等定義,而是自己定義了一套數據類型,如 INT16U 表示 16 位無符號整型,對于 STM32 這樣的 32 位內核,INT16U unsigned short型,如果是16位的處理器,則是unsignedint型。如圖示:

這里尤其注意OS_STK類型,這里是32位的。
接下來是定義棧的增長方向,CM3棧是由高地址向低地址增長的,
定義 OS_TASK_SW 宏。OS_TASK_SW 宏是 uC/OS-II 從低優先級任務切換到高優先級任務時的調用,可以采用下面兩種方式定義:如果處理器支持軟中斷,可以使用軟中斷將中斷向量指向OSCtxSw 函數;
不同的硬件的位數不一樣,棧的增長方向也不一樣,自然都要修改。
3)移植os_cpu_c.c文件

      os_cpu_c.c 主要定義了系統需要的鉤子函數,其中必須需要移植的是OSTaskStkInit函數,這個函數在任務創建時被調用,它負責初始化任務的堆棧結構,其他的鉤子函數可以暫時不用理會,有興趣的可以自行了解。

堆棧初始化函數OSTaskStkInit是由任務創建函數OSTaskCreate()OSTaskCreateExt()這兩個函數調用,用于在創建任務的時候初始堆棧,從上面的代碼中可以看出就是在任務堆棧中保存寄存器的值。
        這里要注意一下入棧順序,要根據CM3的體系,其中CM3硬件會自動將FPSCRXPSRPCLRR12R0-R3入棧,入棧順序遵照Stackframe,剩下的R4-R11需要手動入棧。
      移植UCOSIIstm32三個文件改動基本不大,主要是OS_CPU_A.ASM需要改動,其他的都是默認和CM3的體系相近,不用做出大的改動即可移植成功。
至此,UCOSII移植就已經全部完成了。


本教程主要是為了對系統移植的過程有個大概了解,其中的細節沒有進行分析,因技術水平有限,有錯漏之處歡迎指出或有更好的學習建議也希望可以回復交流,共同學習、進步。
謝謝!


回復

使用道具 舉報

ID:282997 發表于 2019-3-17 15:51 | 顯示全部樓層
這個工程適用于F4嗎
回復

使用道具 舉報

ID:142059 發表于 2019-3-23 23:59 來自手機 | 顯示全部樓層
找你玩 發表于 2019-3-17 15:51
這個工程適用于F4嗎

看看我發的fsc_stos,簡單易懂
回復

使用道具 舉報

ID:126534 發表于 2019-5-30 09:24 | 顯示全部樓層
樓主連接在哪里,沒看到有連接啊。
回復

使用道具 舉報

ID:574789 發表于 2020-5-7 13:18 | 顯示全部樓層
群主求鏈接
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国内精品久久久久久 | 色综久久| 国产精品一区二区在线观看 | 二区中文 | 欧美国产一区二区三区 | 久久久久黄 | 国产精品亚洲第一 | 久久久久久久一区 | 国产精品美女久久久久久久久久久 | 国产精品揄拍一区二区久久国内亚洲精 | 欧美一级片a | 亚洲视频中文字幕 | 亚洲高清视频在线 | 色站综合 | 一区二区三区四区在线免费观看 | 中文字幕亚洲精品 | 一道本不卡视频 | 久久小视频 | 国产精品久久久久久婷婷天堂 | 香蕉视频在线播放 | 天天操夜夜爽 | 色久五月| 视频一区在线播放 | 亚洲精品电影在线观看 | 成年人视频在线免费观看 | 美女久久| 麻豆亚洲 | 国产一区二区三区在线看 | 欧美日韩专区 | 成人a网 | 久久久免费少妇高潮毛片 | 91久久精品视频 | 亚洲情侣视频 | 7777奇米影视 | 欧美久久久久久久久中文字幕 | 在线久草 | 日日摸夜夜爽人人添av | 国产乱xxav| 久久精品网 | 九色在线观看 | 黄色成人国产 |