在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FreeRTOS中Systick的問題

撞上電子 ? 2023-12-15 08:00 ? 次閱讀

在Cortex-M內核中,系統節拍由Systick時鐘提供,當配置好系統滴答時鐘后,每次時鐘中斷就會觸發中斷處理數xPortSysTickHandler()。

void xPortSysTickHandler( void ){ /* The SysTick runs at the lowest interrupt priority, so when this interrupt * executes all interrupts must be unmasked. There is therefore no need to * save and then restore the interrupt mask value as its value is already * known - therefore the slightly faster vPortRaiseBASEPRI() function is used * in place of portSET_INTERRUPT_MASK_FROM_ISR(). */ vPortRaiseBASEPRI();//屏蔽歸屬FreeRTOS的中斷優先級 { /* Increment the RTOS tick. */ if( xTaskIncrementTick() != pdFALSE )//時鐘計數處理 { /* A context switch is required. Context switching is performed in * the PendSV interrupt. Pend the PendSV interrupt. */ portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;//如果需要切換上下文操作,PendSV標記置位 } }

vPortClearBASEPRIFromISR();}

這部分主要是依靠 xTaskIncrementTick(),來判斷任務切換是否在此次系統時鐘中斷時被需要。如果是,則PendSV標記置位,等待觸發PendSV中斷。來看看 xTaskIncrementTick()。

BaseType_t xTaskIncrementTick( void ){ TCB_t * pxTCB; TickType_t xItemValue; BaseType_t xSwitchRequired = pdFALSE;

/* Called by the portable layer each time a tick interrupt occurs. * Increments the tick then checks to see if the new tick value will cause any * tasks to be unblocked. */ traceTASK_INCREMENT_TICK( xTickCount );

if( uxSchedulerSuspended == ( UBaseType_t ) pdFALSE ) //調度是否被掛起,默認為否 { /* Minor optimisation. The tick count cannot change in this * block. */ const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;

/* Increment the RTOS tick, switching the delayed and overflowed * delayed lists if it wraps to 0. */ xTickCount = xConstTickCount;

if( xConstTickCount == ( TickType_t ) 0U ) /*lint !e774 'if' does not always evaluate to false as it is looking for an overflow. 如果xConstTickCount為0,說明溢出了*/ { taskSWITCH_DELAYED_LISTS();/*切換延遲列表*/ } else { mtCOVERAGE_TEST_MARKER(); }

/* See if this tick has made a timeout expire. Tasks are stored in * the queue in the order of their wake time - meaning once one task * has been found whose block time has not expired there is no need to * look any further down the list. */ if( xConstTickCount >= xNextTaskUnblockTime ) { for( ; ; ) { if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE ) { /* The delayed list is empty. Set xNextTaskUnblockTime * to the maximum possible value so it is extremely * unlikely that the * if( xTickCount >= xNextTaskUnblockTime ) test will pass * next time through. */ xNextTaskUnblockTime = portMAX_DELAY; /*lint !e961 MISRA exception as the casts are only redundant for some ports. */ break; } else { /* The delayed list is not empty, get the value of the * item at the head of the delayed list. This is the time * at which the task at the head of the delayed list must * be removed from the Blocked state. */ pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */ xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );

關鍵問題是,這個函數使用到了pxDelayedTaskList, 這定義在本文件

PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList;

該變量初始化為0,該變量正常初始化位置在創建 Task 對象等的函數中, 也就是說,如果在Tick中斷到來時,如果還沒有任務被創建,就會導致不可預期的結果,中斷服務函數會使用這個野指針,執行任務切換。這會導致觸發棧溢出鉤子函數,或者是直接Hardfault。有些硬件初始化需要借助delay功能,不得不在初始化之前配置SysTick。而又不希望在硬件初始化階段觸發這個Bug。所以在配置SysTick之前,先創建一個初始化任務,初始化 pxDelayedTaskList 這個指針,在初始化任務里配置SysTick,和其他初始化,這樣能夠避免此類問題。或者是在配置SysTick的時候屏蔽中斷,一切準備就緒后,開啟中斷。執行vTaskStartScheduler()默認創建一個空閑任務。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1382

    瀏覽量

    40427
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62399
  • Systick
    +關注

    關注

    0

    文章

    62

    瀏覽量

    13150
收藏 人收藏

    評論

    相關推薦

    FreeRTOS內核默認會初始化systick是必須的嗎?

    FreeRTOS內核默認會初始化systick;原子哥的視頻教程里的例程也會使用delay_init初始化systick。請問是否是必須,有無影響?
    發表于 07-20 08:03

    使用FreeRTOSSystick時鐘的配置分享

    FreeRTOS按照教程移植好之后就可以使用了。需要注意的是從官網下載的針對keil環境下STM32F103的FreeRTOS文件,使用systick時鐘作為rtos的時鐘,而這個systic
    發表于 07-30 11:39

    SysTicK的函數重復定義

    ).原因使用KEIL時在Manage Run-Time Environment勾選的HAL庫,然后添加FreeRTOS操作系統時,工程會出現問題首先是下圖SysTicK的函數重復定義,是因為添加的
    發表于 08-04 07:55

    使用CubeMX 6為freeRTOS生成代碼的問題如何解決?

    我認為在使用 freeRTOS 生成代碼時,新的 CubeMX 6.0 存在錯誤。可能只是從舊的 CubeMX 項目遷移到新的項目時,我不確定。我將使用 CubeMX 5.3 構建的項目更新為
    發表于 01-31 08:56

    系統節拍定時(SysTick)

    SysTick 是一個簡單的系統時鐘節拍計數器,它屬于 ARM Cortex-M3 內核嵌套向量中斷 控制器 NVIC 里的一個功能單元,而非片內外設。SysTick 常用于操作系統(如:μC/OS-II、 FreeRTOS
    發表于 01-13 16:34 ?8次下載

    如何使用STM32實現systick的精確延時

    SYSTICK寄存器初始化 void SysTick_Configuration(void) { if (SysTick_Config(SystemCoreClock / 100
    發表于 11-21 15:54 ?5978次閱讀

    STM32SysTick時鐘源來自哪里?

    STM32的SysTick時鐘源來自哪里?
    的頭像 發表于 03-03 14:32 ?7940次閱讀

    如何使用STM32單片機systick來實現延時定時功能

    SysTick 控制及狀態寄存器的使能位清除,就永不停息。這樣可以用systick來實現延時定時功能,不用再占用系統定時器。systick也多用做系統的時鐘節拍,如
    的頭像 發表于 02-14 06:25 ?6940次閱讀
    如何使用STM32單片機<b class='flag-5'>systick</b>來實現延時定時功能

    STM32—關于SYSTICK系統時鐘的詳解及學習筆記

    /*配置SYSTICK很簡單,只需在SySTick_Config寫入一個不大于2^24次方的數,就可以產生systick中斷1.無需對NVIC進行配置,在
    發表于 11-30 15:51 ?15次下載
    STM32—關于<b class='flag-5'>SYSTICK</b>系統時鐘的詳解及學習筆記

    STM32_SysTick—系統定時器

    SysTick 的簡介和寄存器的詳細描述。因為 SysTick 是屬于CM3 內核的外設,有關寄存器的定義和部分庫函數都在 core_CM3.h 這個頭文件實現。所以學習 SysTick
    發表于 12-23 19:56 ?2次下載
    STM32_<b class='flag-5'>SysTick</b>—系統定時器

    systick定時器 延時計時

    是cortex M內核的單片機,都擁有這個24位的systick定時器。systick定時器是一個24位遞減計時器,用戶至于要掌握CMSIS包SysTick_Config 函數進行
    發表于 01-18 10:28 ?7次下載
    <b class='flag-5'>systick</b>定時器 延時計時

    STM32單片機systick使用注意事項

    寄存器自動重裝載定時初值。只要不把它在SysTick 控制及狀態寄存器的使能位清除,就永不停息。這樣可以用systick來實現延時定時功能,不用再占用系統定時器。
    發表于 01-18 10:35 ?1次下載
    STM32單片機<b class='flag-5'>systick</b>使用注意事項

    什么是FreeRTOS的延時

    FreeRTOS的時鐘節拍通常由**SysTick**提供,它周期性的產生定時中斷,所謂的時鐘節拍管理的核心就是這個定時中斷的服務程序。**FreeRTOS**的時鐘節拍isr核心的
    的頭像 發表于 02-14 09:45 ?3574次閱讀
    什么是<b class='flag-5'>FreeRTOS</b>的延時

    SysTick時鐘

    Cortex-M3內核的處理器,內部包含了一個SysTick定時器,SysTick是一個24位的倒計數定時器,當計數到0時,將從ReLoad寄存器自動重裝載定時初值,開始新一輪計數。只要不把它在
    的頭像 發表于 03-01 17:40 ?887次閱讀
    <b class='flag-5'>SysTick</b>時鐘

    systick_handler無法進入怎么解決

    在嵌入式系統SysTick是一個用于定時器和延時的模塊,通常用于處理實時任務、中斷和延時等。然而,在某些情況下,SysTick中斷處理函數(systick_handler)可能無法
    的頭像 發表于 12-01 15:36 ?5276次閱讀
    主站蜘蛛池模板: 久久成人国产精品免费 | 成人丁香婷婷 | a级毛毛片看久久 | 五月婷婷综合激情网 | 一级女人毛片人一女人 | 日本wwwhdsex69| 黄色高清视频网站 | 午夜 福利 | 亚洲视频一区网站 | 亚洲色图日韩精品 | 特一级黄色毛片 | 色视频线观看在线播放 | 日日爽夜夜 | 午夜爽爽 | 色老头综合免费视频 | 国产五月婷婷 | 亚洲综合涩 | 午夜精品视频在线观看美女 | 美女网战色 | 夜夜爱夜夜爽夜夜做夜夜欢 | 国产一级特黄老妇女大片免费 | 人人舔 | 一区二区三区视频网站 | www.四虎在线 | 草逼网址 | 性xxxfreexxxx性欧美 | 熊出没之环球大冒险旧版免费观看 | 欧美性猛交xxxx免费看久久 | 久久精品国波多野结衣 | 亚欧美视频| 精品国产高清在线看国产 | 香港经典a毛片免费观看爽爽影院 | 亚洲欧美日韩在线观看你懂的 | 色秀视频免费网站在线观看 | 开心色99×xxxx| 在线视频网址免费播放 | 国内精品第一页 | 天天爽夜夜爽人人爽 | 四虎影院官网 | 2021久久天天躁狠狠躁夜夜 | 高清激情小视频在线观看 |