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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3945|回復: 1
打印 上一主題 下一主題
收起左側

UCOSIII任務調度原理

[復制鏈接]
跳轉到指定樓層
樓主
ID:907990 發表于 2021-4-18 20:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本文主要講解ucos如何實現任務的調度,調度過程中主要涉及到的函數和知識點。
0x01引言
ucos是一種嵌入式實時多任務操作系統,其高度可靠性、魯棒性和安全性,得到美國宇航局的認證。已經廣泛使用在從照相機到航空電子產品的各種應用中。為了更好的了解UCOS的任務調度原理,本文從代碼進行分析。
0x02原理
0x02-1
UCOS能實現任務調度是采用中斷來實現,對于STM32其使用了SysTick定時器,用它來產生系統的時基,維持系統的“心跳”。對于SysTick定時器的初始化是在main函數中OS_CPU_SysTickInit()完成,它的代碼如下:
void OS_CPU_SysTickInit (void)
{
    INT32U  cnts;
    cnts =OS_CPU_SysTickClkFreq() / OS_TICKS_PER_SEC;
   OS_CPU_CM3_NVIC_ST_RELOAD = (cnts - 1);
   OS_CPU_CM3_NVIC_ST_CTRL |= OS_CPU_CM3_NVIC_ST_CTRL_CLK_SRC |OS_CPU_CM3_NVIC_ST_CTRL_ENABLE;
   OS_CPU_CM3_NVIC_ST_CTRL  |=OS_CPU_CM3_NVIC_ST_CTRL_INTEN;
}
這個函數主要是完成了SysTick計時器的初始化,首先利用OS_CPU_SysTickClkFreq()獲取系統的頻率,根據OS_TICKS_PER_SEC,也就是每秒鐘的心跳數(中斷次數),得到定時器需要設定的每次中斷的計時數,最后調用相關的寄存器設置宏來初始化定時器。這些宏的具體定義大家可以通過源碼直接查看(關注公眾號,回復ucos即可獲取,在keil下編譯后在指定變量上右擊查看定義即可)。
OS_CPU_SysTickClkFreq()函數主要獲取硬件頻率,代碼如下:
INT32U OS_CPU_SysTickClkFreq (void)
{
    INT32U  freq;
    freq =BSP_CPU_ClkFreq();
    return(freq);
}
這里調用了BSP_CPU_ClkFreq()來獲取頻率,其代碼為:
CPU_INT32U BSP_CPU_ClkFreq (void)
{
   RCC_ClocksTypeDef  rcc_clocks;
   RCC_GetClocksFreq(&rcc_clocks);
    return((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}
RCC_GetClocksFreq(&rcc_clocks)這個函數是stm32固件庫中的函數,具體代碼大家可以看一下,它可以返回系統的硬件頻率。
0x02-2
設定好定時器后,stm32便可以產生定時中斷了,中斷調用中斷函數OS_CPU_SysTickHandler ()來實現任務的調度。其在verter.s中設定,這部分涉及到stm32硬件相關知識暫不講解。代碼如下
void OS_CPU_SysTickHandler (void)
{
   OS_CPU_SR  cpu_sr;
   OS_ENTER_CRITICAL();
   OSIntNesting++;
   OS_EXIT_CRITICAL();
   OSTimeTick();
   OSIntExit();
}
這里首先定義了一個OS_CPU_SR變量,用于接受PRIMASK中斷屏蔽寄存器的值。然后調用OS_ENTER_CRITICAL()進入臨界段,所謂臨界段就是系統不希望被其他中斷打擾(NMI和硬fault除外,具體功能大家查一下手冊),然后將OSIntNesting(表示中斷嵌套的層數)加1,執行完之后便退出臨界段,臨界段所處的時間越短越好,太長時間將會影響到其他中斷的響應,對實時性不利,同樣其他不希望被中斷打擾一切操作都可以用這兩個函數來進行控制。接著便調用OSTimeTick()和OSIntExit()完成這次任務調度,這兩個函數下次講解。
先看一下OS_ENTER_CRITICAL(),代碼如下
#define OS_ENTER_CRITICAL()  {cpu_sr =OS_CPU_SR_Save();}
這是一個宏定義,調用了OS_CPU_SR_Save(),其是一個匯編程序,如下
OS_CPU_SR_Save
    MRS     R0, PRIMASK
    CPSID   I
    BX      LR
這里將PRIMASK存入R0,然后關閉總中斷,跳回原來函數,這樣就進入了臨界段,不會有其他中斷打擾。PRIMASK在手冊中解釋為這個寄存器只有一個位,置1后,將關閉所有可屏蔽中斷的異常,只剩NMI和硬fault,默認值為0。
R0是什么,就是調用函數傳進來的第一個參數,也就是cpu_sr。在匯編中R0~R3會依次接受傳進來的不多于4個參數,再多的話建議采用指針或者堆棧。

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:192176 發表于 2021-12-2 10:17 | 只看該作者
后面還有嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区在线播放 | 亚洲精品高清视频在线观看 | 狠狠夜夜 | www.伊人.com | 日韩在线一区二区 | 欧美激情久久久 | 99re99| a级大片免费观看 | 欧美中文一区 | 国产精品久久久久久吹潮 | 欧美日韩久久久久 | 不卡的av在线 | 亚洲视频一区在线 | 91美女视频| 国产精品视频一区二区三区四区国 | 精品欧美乱码久久久久久 | 久草网站 | 欧美日韩大陆 | 在线播放一区 | 欧美日韩在线看 | 在线国产视频 | 一区二区三区中文字幕 | 国产成人免费网站 | 成人精品一区二区三区中文字幕 | 中文字幕第一页在线 | 国产成人免费在线 | 精品国产乱码一区二区三区a | 黄色大片免费网站 | 国产一区二区三区在线 | 免费黄色大片 | 国产精品一区三区 | 色婷综合网 | 亚洲国产成人精品久久久国产成人一区 | 亚洲成人精品 | 久久综合久久久 | 在线观看午夜视频 | 亚洲欧洲精品成人久久奇米网 | 国产精品亚洲成在人线 | 免费av播放 | 亚洲欧美日韩精品久久亚洲区 | 欧美一区二区三区 |