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

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

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

3天內不再提示

詳解單片機三種應用程序的架構

Q4MP_gh_c472c21 ? 來源:CSDN技術社區 ? 作者:大橙子瘋 ? 2022-03-29 11:36 ? 次閱讀

摘要:對于單片機程序來說,大家都不陌生,但是真正使用架構,考慮架構的恐怕并不多,隨著程序開發的不斷增多,架構是非常必要的。

應用程序的架構大致有三種:

1、簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考程序的具體架構,直接通過執行順序編寫應用程序即可。

2、時間片輪詢法,此方法是介于順序執行與操作系統之間的一種方法。

3、操作系統,此法應該是應用程序編寫的最高境界。

一、程序框架設計

1、前后臺順序執行法

這是初學者們常用的程序框架設計方案,不用考慮太多東西,代碼簡單,或者對系統的整體實時性和并發性要求不高;初始化后通過while(1){}for(;;){}`循環不斷調用自己編寫完成的函數,也基本不考慮每個函數執行所需要的時間,大部分情況下函數中或多或少都存在毫秒級別的延時等待。

  • 優點:對于初學者來說,這是最容易也是最直觀的程序架構,邏輯簡單明了,適用于邏輯簡單,復雜度比較低的軟件開發。

  • 缺點:實時性低,由于每個函數或多或少存在毫秒級別的延時,即使是1ms,也會造成其他函數間隔執行時間的不同,雖然可通過定時器中斷的方式,但是前提是中斷執行函數花的時間必須短。當程序邏輯復雜度提升時,會導致后來維護人員的大腦混亂,很難理清楚該程序的運行狀態。

以下是在校期間做的寢室防盜系統的部分代碼(當時也存在部分BUG,沒有解決。現在再看,其實很多問題,而且比較嚴重,比如中斷服務函數內竟然有3000ms延時,這太可怕了,還有串口發送等等;由于實時性要求不算太高,因此主函數中的毫秒級別延時對系統運行沒有多大影響,當然除BUG外;若是后期需要維護,那就是一個大工程,還不如推翻重寫):

intmain(void)
{
u8temperature;
u8humidity;
inta;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
I2c_init();
uart2_Init(9600);
uart_init(9600);//串口初始化為115200
TIM3_Int_Init(4999,7199);
ds1302_init();
while(DHT11_Init())//DHT11初始化
{
led2=0;
}
a1602_init();
Ds1302Init();
EXTIX_Init();
GPIOX_Init();
lcd12864_INIT();
LcdInit();
beep_init();
RED_Init();
led1=1;
beep=0;
while(1)
{
for(a=0;a<11;a++)
{
num[a+3]=At24c02Read(a+2)-208;
delay_us(10);
}
for(a=0;a<6;a++)
{
shuru[a]=At24c02Read(a+13)-208;
delay_us(10);
}
delay_ms(10);
RED_Scan();
Ds1302ReadTime();//讀取ds1302的日期時間
shi=At24c02Read(0);//讀取鬧鐘保存的數據
delay_ms(10);
fen=At24c02Read(1);//讀取鬧鐘保存的數據
usart2_scan();//藍牙數據掃描
usart2_bian();//藍牙處理數據
usart2_gai();
nao_scan();
k++;
if(k<20)
{
if(k==1)
LcdWriteCom(0x01);//清屏
LcdDisplay();//顯示日期時間
}
if(RED==0)
RED_Scan();
if(k>=20&&k<30)
{
if(k==20)
LcdWriteCom(0x01);//清屏
Lcddisplay();//顯示溫濕度
LcdWriteCom(0x80+6);
DHT11_Read_Data(&temperature,&humidity);//讀取溫濕度值
Temp=temperature;Humi=humidity;
LcdWriteData('0'+temperature/10);
LcdWriteData('0'+temperature%10);
LcdWriteCom(0x80+0X40+6);
LcdWriteData('0'+humidity/10);
LcdWriteData('0'+humidity%10);
}
if(k==30)
k=0;
lcd12864();//顯示防盜鬧鐘狀態
}
}

//定時器3中斷服務程序
voidTIM3_IRQHandler(void)//TIM3中斷
{
inti;
if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//檢查TIM3更新中斷發生與否
{
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除TIMx更新中斷標志
if(key1==1&&FEN-fen==0&&SHI-shi==0)//時間一到鬧鐘響起
{
f=1;
}
if(key1==0||FEN-fen!=0||SHI-shi!=0)
else
{
f=0;
}
if(USART_RX_BUF[0]=='R'&&USART_RX_BUF[1]=='I'&&USART_RX_BUF[2]=='N'&&USART_RX_BUF[3]=='G')
{
key0=1;
for(i=0;i<17;i++)
{
USART_SendData(USART1,num[i]);//向串口1發送數據
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
USART_RX_STA=0;
}
delay_ms(3000);
for(i=0;i<3;i++)
{
USART_SendData(USART1,num1[i]);//向串口1發送數據
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束
USART_RX_STA=0;
}
}
}
}

二、時間片論法

介于前后臺順序執行法操作系統之間的一種程序架構設計方案。該設計方案需能幫助嵌入式軟件開發者更上一層樓,在嵌入式軟件開發過程中,若遇到以下幾點,那么該設計方案可以說是最優選擇,適用于程序較復雜的嵌入式系統

  • 目前的需求設計需要完全沒有必要上操作系統。
  • 任務函數無需時刻執行,存在間隔時間(比如按鍵,一般情況下,都需要軟件防抖,初學者的做法通常是延時10ms左右再去判斷,但10ms極大浪費了CPU的資源,在這段時間內CPU完全可以處理很多其他事情)
  • 實時性有一定的要求。

該設計方案需要使用一個定時器,一般情況下定時1ms即可(定時時間可隨意定,但中斷過于頻繁效率就低,中斷太長,實時性差),因此需要考慮到每個任務函數的執行時間,建議不能超過1ms(能通過程序優化縮短執行時間則最好優化,如果不能優化的,則必須保證該任務的執行周期必須遠大于任務所執行的耗時時間),同時要求主循環或任務函數中不能存在毫秒級別的延時。

如何確定每個函數的任務周期呢?根據任務的耗時和效果決定、如按鍵掃描任務周期為 10ms(為了提高響應),指示燈控制任務周期為 100ms(通常情況下最高100ms的閃爍頻率正好,特殊需求除外),LCD/OLED 顯示周期為 100ms(通過這種通過SPI/IIC接口的方式耗時大約在 1~10ms,甚至更長,所以任務周期必須遠大于耗時,同時為了滿足人眼所能接受的刷屏效果,也不能太長,100ms 的任務周期比較合適)等。

以下介紹兩種不同的實現方案,分別針對無函數指針概念的朋友和想進一步學習的朋友。

1、無函數指針的設計方式

/**
*@brief主函數.
*@paramNone.
*@returnNone.
*/

intmain(void)
{
System_Init();

while(1)
{
if(TIM_1msFlag)//1ms
{
CAN_CommTask();//CAN發送/接收通信任務

TIM_1msFlag=0;
}
if(TIM_10msFlag)//10ms
{
KEY_ScanTask();//按鍵掃描處理任務

TIM_10msFlag=0;
}
if(TIM_20msFlag)//20ms
{
LOGIC_HandleTask();//邏輯處理任務

TIM_20msFlag=0;
}
if(TIM_100msFlag)//100ms
{
LED_CtrlTask();//指示燈控制任務

TIM_100msFlag=0;
}
if(TIM_500msFlag)//500ms
{
TIM_500msFlag=0;
}
if(TIM_1secFlag)//1s
{
WDog_Task();//喂狗任務
TIM_1secFlag=0;
}
}
}

/**
*@brief定時器3中斷服務函數.
*@paramNone.
*@returnNone.
*/
voidTIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//溢出中斷
{
sg_1msTic++;
sg_1msTic%1==0?TIM_1msFlag=1:0;
sg_1msTic%10==0?TIM_10msFlag=1:0;
sg_1msTic%20==0?TIM_20msFlag=1:0;
sg_1msTic%100==0?TIM_100msFlag=1:0;
sg_1msTic%500==0?TIM_500msFlag=1:0;
sg_1msTic%1000==0?(TIM_1secFlag=1,sg_1msTic=0):0;
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中斷標志位
}

2、含函數指針的設計方式

/**
*@brief任務函數相關信息結構體定義.
*/
typedefstruct{
uint8m_runFlag;/*!
uint16m_timer;/*!
uint16m_itvTime;/*!
void(*m_pTaskHook)(void);/*!
}TASK_InfoType;

#defineTASKS_MAX5//定義任務數目

/**任務函數相關信息*/
staticTASK_InfoTypesg_tTaskInfo[TASKS_MAX]={
{0,1,1,CAN_CommTask},//CAN通信任務
{0,10,10,KEY_ScanTask},//按鍵掃描任務
{0,20,20,LOGIC_HandleTask},//邏輯處理任務
{0,100,100,LED_CtrlTask},//指示燈控制任務
{0,1000,1000,WDog_Task},//喂狗任務
};


/**
*@brief任務函數運行標志處理.
*@note該函數由1ms定時器中斷調用
*@paramNone.
*@returnNone.
*/
voidTASK_Remarks(void)
{
uint8i;
for(i=0;iif(sg_tTaskInfo[i].m_timer)
{
sg_tTaskInfo[i].m_timer--;
if(0==sg_tTaskInfo[i].m_timer)
{
sg_tTaskInfo[i].m_timer=sg_tTaskInfo[i].m_itvTime;
sg_tTaskInfo[i].m_runFlag=1;
}
}
}
}

/**
*@brief任務函數運行處理.
*@note該函數由主循環調用
*@paramNone.
*@returnNone.
*/
voidTASK_Process(void)
{
uint8i;
for(i=0;iif(sg_tTaskInfo[i].m_runFlag)
{
sg_tTaskInfo[i].m_pTaskHook();//運行任務
sg_tTaskInfo[i].m_runFlag=0;//標志清0
}
}
}

/**
*@brief主函數.
*@paramNone.
*@returnNone.
*/
intmain(void)
{
System_Init();
while(1)
{
TASK_Process();
}
}

/**
*@brief定時器3中斷服務函數.
*@paramNone.
*@returnNone.
*/
voidTIM3_IRQHandler(void)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)//溢出中斷
{
TASK_Remarks();
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除中斷標志位
}

三、操作系統

嵌入式操作系統EOS(Embedded OperatingSystem)是一種用途廣泛的系統軟件,過去它主要應用于工業控制和國防系統領域,而對于單片機來說,比較常用的有UCOSFreeRTOSRT-Thread Nano和RTX 等多種搶占式操作系統(其他如Linux等操作系統不適用于單片機)

操作系統和“時間片論法”,在任務執行方面來說,操作系統對每個任務的耗時沒有過多的要求,需要通過設置每個任務的優先級,在高優先級的任務就緒時,會搶占低優先級的任務;操作系統相對復雜,因此這里沒有詳細介紹了。

關于如何選擇合適的操作系統(uCOSFreeRTOSRTThreadRTXRTOS的對比之特點:

  • uCOS:網上資料豐富,非常適合學習,但是在產品上使用則需要收費。
  • FreeRTOS:使用免費,因此很多產品都在用。
  • RT-Thread:國產物聯網操作系統,有著十分豐富的組件,也免費,資料:RT-Thread文檔中心
  • RTX:為ARM和Cortex-M設備設計的免版稅,確定性的實時操作系統。

借網上一張對比圖:

詳解單片機三種應用程序的架構

四、總結

從上述的對比中可以看出,時間片輪詢法的優勢還是比較大的,它既有前后臺順序執行法的優點,也有操作系統的優點。結構清晰,簡單,非常容易理解,所以這種是比較常用的單片機設計框架。

原文標題:嵌入式軟件開發常用的3種架構

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。
審核編輯:湯梓紅


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

    關注

    6032

    文章

    44525

    瀏覽量

    633257
  • 嵌入式
    +關注

    關注

    5072

    文章

    19026

    瀏覽量

    303515
  • 應用程序
    +關注

    關注

    37

    文章

    3245

    瀏覽量

    57614
  • 架構
    +關注

    關注

    1

    文章

    510

    瀏覽量

    25451

原文標題:嵌入式軟件開發常用的3種架構

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單片機開發中常用的三種軟件架構

    嵌入式系統的軟件架構是構建可靠嵌入式應用程序的關鍵。本文將探討單片機開發中常用的三種軟件架構:分層架構
    發表于 09-13 09:25 ?3106次閱讀

    單片機大致應用程序架構三種

    轉載----在工作中經過摸索實驗,總結出單片機大致應用程序架構三種:1. 簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用
    發表于 07-21 08:50

    單片機MCU應用程序架構的相關資料分享

    單片機MCU應用程序架構在網上看到一篇文章,感覺寫的不錯,而且日常涉及到的很多程序也是文章中提到的時間片輪詢法來做的。轉載過來,做個記錄。原文鏈接:http://bbs.eeworld
    發表于 11-04 07:39

    怎樣架構你的單片機程序

    的并不都,而且這類書籍基本沒有。本人經過摸索實驗并總結,大致應用程序架構三種:簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考
    發表于 12-07 09:25

    單片機大致應用程序架構總結

    轉載----微信公眾號在工作中經過摸索實驗,總結出單片機大致應用程序架構三種:簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不
    發表于 12-07 11:18

    單片機應用程序架構有哪幾種呢

    參考:《談談怎樣架構你的單片機程序》。 本人經過摸索實驗,并總結,大致應用程序架構三種:1.
    發表于 12-09 07:48

    單片機應用程序架構有哪些?三種架構的詳細資料和代碼說明

    本人經過摸索實驗,并總結,大致應用程序架構三種: 1. 簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考程序的具體
    發表于 09-09 17:26 ?1次下載
    <b class='flag-5'>單片機</b>的<b class='flag-5'>應用程序</b><b class='flag-5'>架構</b>有哪些?<b class='flag-5'>三種</b><b class='flag-5'>架構</b>的詳細資料和代碼說明

    干貨:一文搞懂單片機應用程序架構

    的并不都,而且這類書籍基本沒有。 本人經過摸索實驗并總結,大致應用程序架構三種: 1. 簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考
    的頭像 發表于 10-30 17:05 ?562次閱讀

    單片機大致應用程序三種架構總結、方法的利弊和適應范圍

    在工作中經過摸索實驗,總結出單片機大致應用程序架構三種:?1. 簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考
    的頭像 發表于 02-14 10:08 ?3250次閱讀

    淺析單片機三種應用程序架構

    在工作中經過摸索實驗,總結出單片機大致應用程序架構三種: 1. 簡單的前后臺順序執行程序,這類寫法是大多
    的頭像 發表于 04-07 09:44 ?4414次閱讀

    三種單片機應用程序架構的利弊和適應范圍資料下載

    電子發燒友網為你提供三種單片機應用程序架構的利弊和適應范圍資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望
    發表于 04-17 08:54 ?4次下載
    <b class='flag-5'>三種</b><b class='flag-5'>單片機</b><b class='flag-5'>應用程序</b>的<b class='flag-5'>架構</b>的利弊和適應范圍資料下載

    嵌入式軟件開發三種程序架構詳解

    單片機軟件開發的初期大多數開發者采用的都是簡單的前后臺順序執行架構(我就是這樣的)。在嵌入式軟件開發中,程序架構主要分為三種,本篇文章將對這
    的頭像 發表于 09-05 09:53 ?3747次閱讀
    嵌入式軟件開發<b class='flag-5'>三種</b><b class='flag-5'>程序</b><b class='flag-5'>架構</b><b class='flag-5'>詳解</b>

    單片機MCU應用程序架構

    單片機MCU應用程序架構在網上看到一篇文章,感覺寫的不錯,而且日常涉及到的很多程序也是文章中提到的時間片輪詢法來做的。轉載過來,做個記錄。原文鏈接:http://bbs.eeworld
    發表于 10-29 11:21 ?12次下載
    <b class='flag-5'>單片機</b>MCU<b class='flag-5'>應用程序</b><b class='flag-5'>架構</b>

    一文搞懂單片機應用程序架構

    的并不都,而且這類書籍基本沒有。本人經過摸索實驗并總結,大致應用程序架構三種:簡單的前后臺順序執行程序,這類寫法是大多數人使用的方法,不需用思考
    發表于 11-24 19:36 ?12次下載
    一文搞懂<b class='flag-5'>單片機</b><b class='flag-5'>應用程序</b><b class='flag-5'>架構</b>

    實用:牛人總結的單片機三種應用程序架構

    單片機大致應用程序架構有簡單的前后臺順序執行程序、時間片輪詢法、操作系統三種
    發表于 02-08 16:39 ?11次下載
    實用:牛人總結的<b class='flag-5'>單片機</b><b class='flag-5'>三種</b><b class='flag-5'>應用程序</b><b class='flag-5'>架構</b>!