精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在STM32芯片上實(shí)現(xiàn)多任務(wù)處理?

嵌入式攻城獅 ? 來源:嵌入式攻城獅 ? 2023-06-18 09:54 ? 次閱讀

嵌入式系統(tǒng)中,需要同時(shí)處理多個(gè)任務(wù)的需求非常普遍。本文將介紹如何在STM32芯片上實(shí)現(xiàn)多任務(wù)處理,通過合理的任務(wù)調(diào)度和管理,充分發(fā)揮芯片的性能,提高系統(tǒng)的靈活性和效率。下面介紹兩種多任務(wù)處理的實(shí)現(xiàn)方法

1.時(shí)間片輪轉(zhuǎn)調(diào)度機(jī)制

時(shí)間片輪轉(zhuǎn)調(diào)度機(jī)制是利用定時(shí)器中斷來實(shí)現(xiàn)的。設(shè)置一個(gè)定時(shí)器,當(dāng)定時(shí)器中斷發(fā)生時(shí),切換到下一個(gè)任務(wù)的執(zhí)行。下面是一個(gè)簡單的時(shí)間片輪轉(zhuǎn)調(diào)度機(jī)制的示例代碼

定義不同的任務(wù):定義任務(wù)的優(yōu)先級(jí)、堆棧大小、維護(hù)一個(gè)任務(wù)列表,通過編寫調(diào)度器代碼,在合適的時(shí)機(jī)選擇下一個(gè)任務(wù)來執(zhí)行。

#include"stm32fxxx.h"
//定義任務(wù)的優(yōu)先級(jí)
#defineTASK1_PRIORITY1
#defineTASK2_PRIORITY2
//定義任務(wù)的堆棧大小
#defineTASK_STACK_SIZE128
//定義任務(wù)堆??臻g
uint32_ttask1_stack[TASK_STACK_SIZE];
uint32_ttask2_stack[TASK_STACK_SIZE];
//定義任務(wù)函數(shù)
voidtask1(void);
voidtask2(void);
//定義任務(wù)控制塊結(jié)構(gòu)
typedefstruct{
uint32_t*stack_ptr;
}TaskControlBlock;
//定義任務(wù)控制塊實(shí)例
TaskControlBlocktcb1;
TaskControlBlocktcb2;
//定義當(dāng)前任務(wù)指針
TaskControlBlock*current_task;
//任務(wù)1的函數(shù)
voidtask1(void){
while(1){
//任務(wù)1的處理邏輯
//切換任務(wù)
__asmvolatile("yield");
}
}
//任務(wù)2的函數(shù)
voidtask2(void){
while(1){
//任務(wù)2的處理邏輯

//切換任務(wù)
__asmvolatile("yield");
}
}

定時(shí)器中斷:在中斷處理函數(shù)中切換任務(wù),并保存當(dāng)前任務(wù)的上下文(包括寄存器、堆棧等),然后加載下一個(gè)任務(wù)的上下文,使其開始執(zhí)行。

//定義定時(shí)器中斷處理函數(shù)
voidTIM_IRQHandler(void){
//切換到下一個(gè)任務(wù)
if(current_task==&tcb1){
current_task=&tcb2;
}else{
current_task=&tcb1;
}
//加載下一個(gè)任務(wù)的堆棧指針
__asmvolatile("movsp,%0"::"r"(current_task->stack_ptr));
}
多個(gè)任務(wù)之間可能需要進(jìn)行通信和共享資源??梢允褂萌肿兞炕蚱渌綑C(jī)制來實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)傳遞和資源共享。
intmain(){
//初始化任務(wù)控制塊
tcb1.stack_ptr=task1_stack+TASK_STACK_SIZE-1;
tcb2.stack_ptr=task2_stack+TASK_STACK_SIZE-1;

//初始化定時(shí)器,設(shè)置定時(shí)器中斷
//這里使用TIM3作為定時(shí)器,具體配置請(qǐng)根據(jù)實(shí)際情況進(jìn)行修改
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
TIM_TimeBaseInitTypeDefTIM_InitStruct;
TIM_InitStruct.TIM_Prescaler=1000;
TIM_InitStruct.TIM_Period=1000;
TIM_InitStruct.TIM_CounterMode=TIM_CounterMode_Up;
TIM_InitStruct.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM3,&TIM_InitStruct);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
NVIC_EnableIRQ(TIM3_IRQn);
TIM_Cmd(TIM3,ENABLE);

//初始化當(dāng)前任務(wù)指針
current_task=&tcb1;

//啟動(dòng)任務(wù)1
task1();

while(1){
//主循環(huán),任務(wù)在定時(shí)器中斷中切換
}
}

這種簡單的多任務(wù)處理方式適用于較簡單的應(yīng)用場(chǎng)景,但對(duì)于復(fù)雜的多任務(wù)應(yīng)用,建議使用RTOS來提供更好的任務(wù)管理和調(diào)度機(jī)制。

2.使用RTOS(實(shí)時(shí)操作系統(tǒng))

RTOS是一種常用的多任務(wù)處理解決方案,它提供了任務(wù)調(diào)度和管理機(jī)制,簡化了多任務(wù)應(yīng)用的開發(fā)。對(duì)于STM32芯片,常見的RTOS有FreeRTOS、uC/OS等。以下是實(shí)現(xiàn)多任務(wù)處理的基本步驟:

創(chuàng)建任務(wù):使用RTOS的API,在應(yīng)用程序中創(chuàng)建多個(gè)任務(wù)。每個(gè)任務(wù)都有自己的代碼和優(yōu)先級(jí)

voidTask1(void*pvParameters)
{
while(1)
{
//Task1處理代碼
}
}

voidTask2(void*pvParameters)
{
while(1)
{
//Task2處理代碼
}
}

intmain()
{
//硬件初始化和其他配置
//創(chuàng)建任務(wù)
xTaskCreate(Task1,"Task1",configMINIMAL_STACK_SIZE,NULL,1,NULL);
xTaskCreate(Task2,"Task2",configMINIMAL_STACK_SIZE,NULL,2,NULL);

//啟動(dòng)調(diào)度器
vTaskStartScheduler();

//代碼永遠(yuǎn)不會(huì)執(zhí)行到這里
while(1)
{
}
}
內(nèi)核參數(shù):配置RTOS內(nèi)核的一些參數(shù),例如時(shí)鐘節(jié)拍和優(yōu)先級(jí)。
intmain()
{
//硬件初始化和其他配置

//配置FreeRTOS內(nèi)核
//設(shè)置時(shí)鐘節(jié)拍
TickType_ttickRate=1000/configTICK_RATE_HZ;
TickTypeSet(tickRate);

//配置優(yōu)先級(jí)分組
NVIC_SetPriorityGrouping(0);

//創(chuàng)建任務(wù)和啟動(dòng)調(diào)度器
//...

//代碼永遠(yuǎn)不會(huì)執(zhí)行到這里
while(1)
{
}
}
任務(wù)處理代碼:在任務(wù)的處理函數(shù)中,編寫任務(wù)的實(shí)際處理代碼。由于FreeRTOS采用搶占式調(diào)度,每個(gè)任務(wù)的處理函數(shù)應(yīng)該是一個(gè)無限循環(huán),確保任務(wù)不會(huì)結(jié)束。
voidTask1(void*pvParameters)
{
while(1)
{
//Task1處理代碼

//任務(wù)掛起一段時(shí)間,以便給其他任務(wù)執(zhí)行機(jī)會(huì)
vTaskDelay(pdMS_TO_TICKS(100));
}
}

voidTask2(void*pvParameters)
{
while(1)
{
//Task2處理代碼

//任務(wù)掛起一段時(shí)間,以便給其他任務(wù)執(zhí)行機(jī)會(huì)
vTaskDelay(pdMS_TO_TICKS(50));
}
}
這是一個(gè)簡單的示例代碼,實(shí)現(xiàn)了兩個(gè)任務(wù)(Task1和Task2),每個(gè)任務(wù)都在一個(gè)無限循環(huán)中執(zhí)行自己的處理代碼,并使用vTaskDelay()函數(shù)掛起一段時(shí)間,以便給其他任務(wù)執(zhí)行機(jī)會(huì)。使用RTOS可以提供較高的可靠性和靈活性,適用于復(fù)雜的多任務(wù)應(yīng)用場(chǎng)景。


審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5325

    瀏覽量

    120053
  • RTOS
    +關(guān)注

    關(guān)注

    22

    文章

    809

    瀏覽量

    119453
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    62019
  • 定時(shí)器中斷
    +關(guān)注

    關(guān)注

    0

    文章

    49

    瀏覽量

    11165
  • STM32芯片
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    4366

原文標(biāo)題:STM32芯片如何同時(shí)運(yùn)行多個(gè)任務(wù)

文章出處:【微信號(hào):嵌入式攻城獅,微信公眾號(hào):嵌入式攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    關(guān)于多任務(wù)處理的問題

    本帖最后由 mr.pengyongche 于 2013-4-30 03:08 編輯 我用DSP6713BIOS做多任務(wù)處理,一個(gè)硬中斷,一個(gè)軟中斷,一個(gè)任務(wù),任務(wù)優(yōu)先級(jí)最低,作為
    發(fā)表于 07-10 16:11

    STemWin多任務(wù)實(shí)現(xiàn)(工程支持IAR和MDK,使用μCOS-III實(shí)現(xiàn)多任務(wù))

    轉(zhuǎn)本期教程是基于μCOS-III + STemWin5.22 + FatFS實(shí)現(xiàn)的STemWin多任務(wù)(IAR和MDK工程均做了)。一般性的應(yīng)用使用STemWin的單任務(wù)就可以,關(guān)于
    發(fā)表于 10-19 09:39

    如何去實(shí)現(xiàn)基于stm32的FreeRTOS多任務(wù)程序

    基于 stm32 的 FreeRTOS多任務(wù)程序實(shí)現(xiàn)一、什么是FreeRTOS二、AHT20數(shù)據(jù)采集原理電路繪制三、FreeRTOS的多任務(wù)程序設(shè)計(jì)四、參考資料一、什么是FreeRTO
    發(fā)表于 08-24 07:45

    如何實(shí)現(xiàn)基于uC/OSII多任務(wù)STM32報(bào)警模塊的設(shè)計(jì)?

    如何實(shí)現(xiàn)基于uC/OSII多任務(wù)STM32報(bào)警模塊的設(shè)計(jì)?
    發(fā)表于 12-20 06:17

    如何使用CubeMX快速生成FreeRTOS系統(tǒng)并實(shí)現(xiàn)多任務(wù)處理

    如何使用CubeMX快速生成FreeRTOS系統(tǒng)并實(shí)現(xiàn)多任務(wù)處理?
    發(fā)表于 12-20 08:00

    多任務(wù)編程多任務(wù)處理是指什么

    嵌入式Linux應(yīng)用編程-多任務(wù)編程多任務(wù)處理是指用戶可在同一時(shí)間內(nèi)運(yùn)行多個(gè)應(yīng)用程序,每個(gè)正在執(zhí)行的應(yīng)用程序被稱為一個(gè)任務(wù)。Linux就是一個(gè)支持
    發(fā)表于 12-22 08:30

    何在STM32下完成一個(gè)基于FreeRTOS的多任務(wù)程序

    文章目錄前言一、添加溫濕度采集模塊二、基于FreeRTOS的多任務(wù)程序總結(jié)前言此次,本菜鳥有兩個(gè)任務(wù)1.在菜鳥入門5的stm32最小系統(tǒng)中添加 AHT20數(shù)據(jù)采集原理電路(溫濕度傳感器)2.學(xué)習(xí)
    發(fā)表于 02-10 08:02

    采用Protothread實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng)

    采用Protothread實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng) 在許多系統(tǒng)資源非常緊張的單片機(jī)應(yīng)用中,使用實(shí)時(shí)操作系統(tǒng)進(jìn)行任務(wù)調(diào)度來實(shí)現(xiàn)實(shí)時(shí)多任務(wù)系統(tǒng)時(shí),由
    發(fā)表于 03-29 15:10 ?1440次閱讀
    采用Protothread<b class='flag-5'>實(shí)現(xiàn)</b>實(shí)時(shí)<b class='flag-5'>多任務(wù)</b>系統(tǒng)

    51單片機(jī)多任務(wù)機(jī)制的實(shí)現(xiàn)策略研究

    從操作系統(tǒng)實(shí)現(xiàn)多任務(wù)機(jī)制的原理入手,分析了51單片機(jī)實(shí)現(xiàn)多任務(wù)機(jī)制的基本條件,論述了5l單片機(jī)實(shí)現(xiàn)多任務(wù)
    發(fā)表于 09-19 17:26 ?159次下載
    51單片機(jī)<b class='flag-5'>多任務(wù)</b>機(jī)制的<b class='flag-5'>實(shí)現(xiàn)</b>策略研究

    如何輕松幾步實(shí)現(xiàn)STM32運(yùn)行FreeRTOS任務(wù)

    輕松幾步實(shí)現(xiàn)STM32運(yùn)行FreeRTOS任務(wù)
    的頭像 發(fā)表于 03-01 12:07 ?8427次閱讀
    如何輕松幾步<b class='flag-5'>實(shí)現(xiàn)</b>在<b class='flag-5'>STM32</b><b class='flag-5'>上</b>運(yùn)行FreeRTOS<b class='flag-5'>任務(wù)</b>

    基于STM32、FreeRTOS 實(shí)現(xiàn)硬件看門狗+軟件看門狗監(jiān)測(cè)多任務(wù)的方法

    基于STM32、FreeRTOS實(shí)現(xiàn)硬件看門狗+軟件看門狗監(jiān)測(cè)多任務(wù)的方法
    的頭像 發(fā)表于 03-12 10:11 ?9312次閱讀

    stm32基于FreeRTOS的多任務(wù)程序

    目錄實(shí)驗(yàn)環(huán)境實(shí)驗(yàn)?zāi)康膶?shí)驗(yàn)步驟代碼:實(shí)驗(yàn)環(huán)境1.野火STM32MINI開發(fā)板2.keil5實(shí)驗(yàn)?zāi)康脑?b class='flag-5'>STM32下完成一個(gè)基于FreeRTOS的多任務(wù)程序,執(zhí)行3個(gè)周期性task,具體任務(wù)
    發(fā)表于 12-07 10:36 ?14次下載
    <b class='flag-5'>stm32</b>基于FreeRTOS的<b class='flag-5'>多任務(wù)</b>程序

    STM32 簡單多任務(wù)調(diào)度的方法與程序例程

    策略允許兩個(gè)或更多進(jìn)程并發(fā)共享一個(gè)處理器時(shí),事實(shí)處理器在某一時(shí)刻只會(huì)給一件任務(wù)提供服務(wù)。因?yàn)?b class='flag-5'>任務(wù)調(diào)度機(jī)制保證不同
    發(fā)表于 12-22 19:04 ?13次下載
    <b class='flag-5'>STM32</b> 簡單<b class='flag-5'>多任務(wù)</b>調(diào)度的方法與程序例程

    基于FreeRTOS的STM32多任務(wù)程序

    基于FreeRTOS的STM32多任務(wù)程序一、材料準(zhǔn)備二、 FreeRTOS移植FreeRTOS是什么FreeRTOS移植到STM32(MDK開發(fā)環(huán)境)1.下載FreeRTOS源代碼
    發(fā)表于 12-27 18:38 ?28次下載
    基于FreeRTOS的<b class='flag-5'>STM32</b><b class='flag-5'>多任務(wù)</b>程序

    Arduino多任務(wù)處理

    電子發(fā)燒友網(wǎng)站提供《Arduino多任務(wù)處理.zip》資料免費(fèi)下載
    發(fā)表于 06-14 11:05 ?0次下載
    Arduino<b class='flag-5'>上</b>的<b class='flag-5'>多任務(wù)</b><b class='flag-5'>處理</b>