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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3821|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

UCOSIII任務(wù)調(diào)度原理

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

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩有码在线播放 | 成人黄色av网址 | 影音先锋中文在线 | 国产精品久久久久久婷婷天堂 | 日韩在线不卡视频 | 国产午夜精品福利 | 久久夜视频 | 亚洲成人www | 羞羞的视频免费看 | 国产精品中文字幕在线观看 | 久久机热| 91精品国产欧美一区二区成人 | www.一区二区三区 | 操操网站| 久久中文字幕一区 | 欧美亚洲免费 | 男人天堂网址 | 中文字幕一区二区三区乱码图片 | 日韩中文字幕免费 | 毛片99 | 国产成人福利 | 国产成人精品久久二区二区 | www网站在线观看 | 国产欧美精品区一区二区三区 | 久久成人一区二区三区 | 日本一区二区高清不卡 | 亚洲精品视频导航 | 激情综合五月天 | 91在线色视频 | 欧美精品一区二区三区四区 | 精品国产1区2区3区 一区二区手机在线 | 成人日批视频 | 成人在线视频免费观看 | 人人干免费 | 成人不卡| 国产亚洲精品一区二区三区 | 国产精品久久久久久 | 一级做a爰片久久毛片免费看 | 国产精品亚洲一区二区三区在线 | 精品久久九九 | 97色在线视频 |