裸機單片機適用的軟件架構

單片機通常分為三種工作模式,分別是

1、前后臺順序執行法? ? ? ? ? ? ? ????????? 2、操作系統?????????????????????????3、時間片輪詢法? ? ? ? ? ? ??

1、前后臺順序執行法

????????利用單片機的中斷進行前后臺切換,然后進行任務順序執行,但其實在很多時候都是處于一種浪費資源的使用,因為大部分時候都要去查看事件是否發生,并且其實時性低,由于每個函數或多或少存在毫秒級別的延時,即使是1ms,也會造成其他函數間隔執行時間的不同,雖然可通過定時器中斷的方式,但是前提是中斷執行函數花的時間必須短。當程序邏輯復雜度提升時,會導致后來維護人員的大腦混亂,很難理清楚該程序的運行狀態。

其也就是大輪訓進行執行while里面的函數

2、操作系統

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

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

3、時間片輪詢法?

? ? ? 時間片輪詢法是介于前后臺順序執行法和操作系統之間的一種程序架構設計方案。任務函數無需時刻執行,存在間隔時間(比如按鍵,一般情況下,都需要軟件防抖,初學者的做法通常是延時10ms左右再去判斷,但10ms極大浪費了CPU的資源,在這段時間內CPU完全可以處理很多其他事情)。

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

時間片輪詢法的實現(指針方式)

首先定義一個結構體,用于存儲一個任務的所有信息,如下所示:

typedef struct
{uint8_t  u8_runflag;		/*程序是否運行標志    TASK_OFF_RUN:不運行   TASK_ON_RUN:運行*/uint16_t u16_timer;			/*計時器*/uint16_t u16_itvTime;		/*運行間隔時間,也就是多久運行一次*/void (*p_TaskHook)(void);	/*任務*/
}Task_InfoType;

然后創建一個具有綁定關系的任務數組:

static Task_InfoType Task_Info[TASK_MAX] = {{TASK_OFF_RUN,TASK_200ms,TASK_200ms,logic_task},//邏輯任務{TASK_OFF_RUN,TASK_1000ms,TASK_1000ms,led_task}	//LED任務
};

????????從上圖中可以看出,這里創建了兩個任務,一個邏輯任務200ms執行一次,另外一個則是1000ms執行一次的LED任務,根據任務的情況,可以自己添加自己需要的。

? ? ? ? 有了關系之后,那么就需要讓這個小系統跑起來了,下面兩個函數分別是函數標志位修改函數和函數執行函數。其實這個小系統也就是一個計時,到時間,則打開標志位,去執行對應的函數,標志位沒有打開則跳過。

/*任務標志處理函數定時器1ms中斷處理
*/
void Task_Remarks(void)
{for(int i=0;i<TASK_MAX;i++){if(Task_Info[i].u16_timer){Task_Info[i].u16_timer--;if(TASK_TIME_ON == Task_Info[i].u16_timer){//定時器計數到后,打開函數運行標志位Task_Info[i].u16_timer = Task_Info[i].u16_itvTime;Task_Info[i].u8_runflag = TASK_ON_RUN;}}}
}
/*任務函數運行處理放入主函數的循環中
*/
void Task_Process(void)
{for(int i=0;i<TASK_MAX;i++){if(Task_Info[i].u8_runflag == TASK_ON_RUN){Task_Info[i].p_TaskHook();Task_Info[i].u8_runflag = TASK_OFF_RUN;}}
}

弄完這些后,只需要去配置一個1ms定時器,將計時函數放入其中,即可

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *hitm)
{if(hitm->Instance == TIM7){Task_Remarks();}
}

到這里,這個小系統就完成了一大半了,在這里還需要添加一個打印函數,但是如何做到控制這個打印函數,只需要改變宏定義就可以實現關閉所以的打印呢,在實際的項目中,都會使用這種方式來進行系統的調試。

宏定義控制printf-CSDN博客

STM32關于UART的接收方式_stm32中huart1-CSDN博客

關于STM32CubeIDE使用printf串口打印_stm32cubeide printf-CSDN博客

這些都是跟調試有關的一些文章,可以查看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/215476.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/215476.shtml
英文地址,請注明出處:http://en.pswp.cn/news/215476.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spring Boot Web

目錄 一. 概述 二. Spring Boot Web 1.2.1 創建SpringBoot工程&#xff08;需要聯網&#xff09; 1.2.2 定義請求處理類 1.2.3 運行測試 1.3 Web分析 三. Http協議 3.1 HTTP-概述 剛才提到HTTP協議是規定了請求和響應數據的格式&#xff0c;那具體的格式是什么呢? 3…

spring結合設計模式之策略模式

策略模式基本概念&#xff1a; 一個接口或者抽象類&#xff0c;里面兩個方法&#xff08;一個方法匹配類型&#xff0c;一個可替換的邏輯實現方法&#xff09;不同策略的差異化實現(就是說&#xff0c;不同策略的實現類) 使用策略模式替換判斷&#xff0c;使代碼更加優雅。 …

Swagger快速上手

快速開始&#xff1a; 導入maven包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version> </dependency><dependency><groupId>io.springfox<…

MongoDB在Windows系統和Linux系統中實現自動定時備份

本文主要介紹MongoDB在Windows系統和Linux系統中如何實現自動定時備份。 目錄 MongoDB在Windows系統中實現自動定時備份MongoDB在Linux系統中實現自動定時備份備份步驟備份恢復 MongoDB在Windows系統中實現自動定時備份 要在Windows系統中實現自動定時備份MongoDB數據庫&#…

區塊鏈實驗室(32) - 下載arm64的Prysm

Prysm是Ethereum的共識層。 1. 下載prysm.sh curl https://raw.githubusercontent.com/prysmaticlabs/prysm/master/prysm.sh --output prysm.sh && chmod x prysm.sh2. 下載x86版prysm共識客戶端 ./prysm.sh beacon-chain --download-only3.下載arm64版prysm共識客…

刪除當前目錄及其子目錄下的重復文件

言歸正傳&#xff0c;直接看代碼 public class RemoveDuplicateFiles {public static void main(String[] args) throws IOException {String directoryPath "D:\\dir";List<File> allFiles getAllFiles(directoryPath);removeDuplicateFile(allFiles);}pri…

HP108w打印機出現Direct.....無線網,連接不上

本人用手機打印的&#xff0c;安卓 這種情況我也不知道為啥出現&#xff0c;如果出現上面的情況&#xff0c;可以 一直按住&#xff0c;會發藍光的&#xff0c;無線信號樣子的按鈕&#xff0c;持續按20s&#xff0c;松手后觀察自己的wifi列表&#xff0c;本人出現了&#xff…

Linux——web網站服務(一)

一、安裝httpd服務器Apache網站服務 1、準備工作 為了避免發送端口沖突&#xff0c;程序沖突等現象&#xff0c;卸載使用rpm方式安裝的httpd #使用命令檢查是否下載了httpd [rootserver ~]# rpm -qa httpd #如果有則使用 [rootserver ~]# rpm -e httpd --nodeps Apache的配置…

抖音小店經營規則解析:避免被扣分的關鍵因素

抖音小店是一個受歡迎的電商平臺&#xff0c;為創業者提供了良好的銷售和推廣機會。為了確保在抖音小店的運營中不會被扣分或出現其他問題&#xff0c;不若與眾整理了幾個關鍵的規則需要注意和遵守。 1. 產品合規性&#xff1a; 抖音小店要求所有銷售的產品必須合法合規&#x…

欣賞動態之美,不如欣賞C語言實現動態內存管理之美 ! ! !

本篇會加入個人的所謂‘魚式瘋言’ ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 我會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. 可能說的不是那么嚴謹.但小編初心是能讓更多人能接受我們這個概念 &#xff01;&#xff0…

ubuntu解決問題:E: Unable to locate package manpages-posix-dev

sudo apt-get install manpages-posix-dev 想要在ubuntu里面安裝manpages-posix-dev這個包&#xff0c;發現彈出錯誤 E: Unable to locate package manpages-posix-dev 解決方法如下&#xff1a; 1 查看當前ubuntu的版本 abhishekitsfoss:~$ lsb_release -a No LSB module…

python自動化測試實戰 —— WebDriver API的使用

軟件測試專欄 感興趣可看&#xff1a;軟件測試專欄 自動化測試學習部分源碼 python自動化測試相關知識&#xff1a; 【如何學習Python自動化測試】—— 自動化測試環境搭建 【如何學習python自動化測試】—— 瀏覽器驅動的安裝 以及 如何更…

河南省專業技術人員職稱評審之繼續教育

&#xff08;一&#xff09;職稱評審時會遇到一個關于繼續教育學時是否足夠的問題&#xff0c;作為新人很容易一頭霧水&#xff0c;這里以河南省為例&#xff0c;先在管理系統 http://manage.hnzjgl.gov.cn 注冊&#xff0c;根據自己單位選擇&#xff0c;有些高校雖然在地方而不…

力扣題:數字與字符串間轉換-12.12

力扣題-12.12 [力扣刷題攻略] Re&#xff1a;從零開始的力扣刷題生活 力扣題1&#xff1a;539. 最小時間差 解題思想&#xff1a;將字符串的時間形式換成數字形式的時間&#xff0c;然后計算差值即可&#xff0c;最重要的是最小的值加上一天的時間加入到數組最后&#xff08…

圖文教程:stable-diffusion的基本使用教程 txt2img(多圖)

之前我介紹了SD的安裝過程&#xff0c;那么這篇將介紹怎么使用SD 使用模型 SD安裝好之后&#xff0c;我們只有一個默認的模型。這個模型很難滿足我們的繪圖需求&#xff0c;那么有2種方法。 1是自己訓練一個模型&#xff08;有門檻&#xff09;2是去網站上找一個別人練好的模…

Python3 數據類型轉換 ----20231211

# 有時候,我們需要對數據內置的類型進行轉換,數據類型的轉換,一般情況下你只需要將數據類型作為函數名即可。Python 數據類型轉換可以分為兩種:隱式類型轉換 - 自動完成 顯式類型轉換 - 需要使用類型函數來轉換 隱式類型轉換 在隱式類型轉換中,Python 會自動將一種數據類型…

windows 鏡像下載地址

HelloWindows.cn - 精校 完整 極致 Windows系統下載倉儲站

python自動化運維快速入門,python自動化運維教程

大家好&#xff0c;給大家分享一下python自動化運維需要掌握的技能&#xff0c;很多人還不知道這一點。下面詳細解釋一下。現在讓我們來看看&#xff01; 面向學員 熟練使用計算機&#xff0c;對Windows、Linux 有一點了解從業職或在校學生 對目前從事互聯網運維&#xff0c;想…

附錄:已實現的多品種回測收益

聲明&#xff1a; 本人不進行任何投資建議&#xff0c;也不出售任何包括策略、算法的程序代碼。 僅作為個人的2023年開發心路總結&#xff0c;有任何異議可以在評論區留言&#xff0c;可以討論&#xff0c;如果你杠&#xff0c;那就是你對。 這世上有很多條路&#xff0c;每個…

12.11作業

第一個界面的頭文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMovie> #include <QMessageBox>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidg…