一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

LEDs狀態(tài)燈任務(wù)(線程)設(shè)計(jì) (基于RTOS)

黃工的嵌入式技術(shù)圈 ? 來源:網(wǎng)站整理 ? 2020-03-12 11:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

我們學(xué)習(xí)MCU開發(fā),大部分都是面向過程的開發(fā),但實(shí)際項(xiàng)目一般要求我們有面向?qū)ο螅K化)的方式來開發(fā)。

剛學(xué)習(xí)C語言開發(fā)的朋友,應(yīng)該常常聽說面向?qū)ο?,但?shí)際對于面向?qū)ο箝_發(fā)可能還是不太了解。

為了初學(xué)者進(jìn)一步理解,本文結(jié)合實(shí)際項(xiàng)目(LEDs狀態(tài)燈)給大家?guī)肀容^基礎(chǔ)的模塊化設(shè)計(jì)。

Ⅰ關(guān)于C語言的模塊化

對于MCU的開發(fā),大部分人都還是習(xí)慣性用的C語言,原因之一在于C語言具有高效的特點(diǎn)。

可以了解一下,許多操作系統(tǒng)的內(nèi)核使用的編程語言,其實(shí)都用到了C語言,這就是C語言的優(yōu)點(diǎn),也是C語言這么多年不衰敗的原因。

說回來,對于MCU的開發(fā),除了C語言,當(dāng)然還可以其它語言,像C++有許多人就用上了。

C++語言本身就是面向?qū)ο蟮拈_發(fā)語言,定義一個(gè)類,可以包含許多成員。站在C語言的角度,可以理解成定義一個(gè)結(jié)構(gòu)體,里面包含許多數(shù)據(jù)類型。如下面要說的LEDs數(shù)據(jù)結(jié)構(gòu)體:

typedef struct { uint8_t Mode; //模式(常滅 常亮 閃爍) uint8_t Status; //當(dāng)前狀態(tài)(滅 亮) uint16_t OffTimes; //滅時(shí)間(xLED_COUNT_PERIOD毫秒) uint16_t OnTimes; //亮?xí)r間 uint16_t Counter; //計(jì)數(shù)(計(jì)時(shí)) void (*OffFun)(void); //滅函數(shù)接口 void (*OnFun)(void); //亮函數(shù)接口 }LED_TypeDef;

可以看到,結(jié)構(gòu)體里面包含整型變量,函數(shù)指針。

補(bǔ)充,指針函數(shù)與函數(shù)指針的區(qū)別:

1、指針函數(shù):本質(zhì)是一個(gè)函數(shù),函數(shù)返回類型是某一類型的指針。

格式: 類型標(biāo)識符 *函數(shù)名(參數(shù)表)

如:int *f(x,y);

2、函數(shù)指針:本質(zhì)是一個(gè)指針,指向函數(shù)的指針變量。

格式:類型說明符 (*函數(shù)名)(參數(shù))

如:int (*f) (int x);

Ⅱ?yàn)槭裁匆K化設(shè)計(jì)

假如一個(gè)系統(tǒng)中做的事情非常多,比如:采集兩個(gè)增量式編碼器、兩個(gè)絕對值編碼器、控制4個(gè)電機(jī)、控制多個(gè)LED狀態(tài)燈、通信收發(fā)數(shù)據(jù),采集溫度、濕度、超聲波雷達(dá)等···許多模塊,那么問題來了,這么多模塊,你的軟件該如何設(shè)計(jì)?

答案就是需要模塊化設(shè)計(jì)。

模塊化設(shè)計(jì),包含底層驅(qū)動(dòng),中間接口函數(shù),應(yīng)用程序等。對于MCU級別的開發(fā),為了規(guī)范,建議大家從底層設(shè)計(jì)到應(yīng)用層設(shè)計(jì)都按照模塊化的方式來設(shè)計(jì)。

簡單的來說,模塊化就是源文件、數(shù)據(jù)結(jié)構(gòu)、變量、函數(shù)命名等需要按照模塊的方式來設(shè)計(jì)。比如LEDs狀態(tài)燈:IO口的定義用LED(模塊),文件名用led,變量、函數(shù)名抬頭用LED,定義一個(gè)LED數(shù)據(jù)結(jié)構(gòu)(模塊的數(shù)據(jù)結(jié)構(gòu))等。

模塊化的設(shè)計(jì)優(yōu)點(diǎn)在于:便于源代碼管理、移植、理解等等。(相信有許多自己寫的代碼,放一段時(shí)間之后,重新再次閱讀,可能看了半天都不明白源代碼的意思。)

ⅢLEDs實(shí)例講述

為方便大家理解,拿一個(gè)簡單的LEDs狀態(tài)燈的實(shí)例來分析。里面使用到了RTOS簡單系統(tǒng)延時(shí)(本文不講述關(guān)于RTOS的知識)。文末提供例程下載地址。

1.描述

綠、黃、紅三個(gè)(可以自己添加許多個(gè))LED狀態(tài)燈,可獨(dú)自實(shí)現(xiàn)常滅、常亮、閃爍三個(gè)模式。

閃爍:滅、亮?xí)r間可設(shè)置(提供函數(shù)接口修改)。

在一個(gè)線程(任務(wù))里面執(zhí)行。

3個(gè)LED不同亮滅時(shí)間效果:

2.數(shù)據(jù)結(jié)構(gòu)

typedef struct { uint8_t Mode; //模式(常滅 常亮 閃爍) uint8_t Status; //當(dāng)前狀態(tài)(滅 亮) uint16_t OffTimes; //滅時(shí)間(xLED_COUNT_PERIOD毫秒) uint16_t OnTimes; //亮?xí)r間 uint16_t Counter; //計(jì)數(shù)(計(jì)時(shí)) void (*OffFun)(void); //滅函數(shù)接口 void (*OnFun)(void); //亮函數(shù)接口 }LED_TypeDef;

為了方便理解,只使用一個(gè)數(shù)據(jù)結(jié)構(gòu)(實(shí)際大的項(xiàng)目可能有多個(gè)包含,類似C++繼承關(guān)系)。

3.底層LED函數(shù)接口

void LEDGreen_Off(void);

void LEDGreen_On(void);

void LEDYellow_Off(void);

void LEDYellow_On(void);

void LEDRed_Off(void);

void LEDRed_On(void);

主要就是亮滅函數(shù)接口,這里提供三組LED(根據(jù)需求可添加)。

4.定義局部變量

static LED_TypeDef sLEDG_Structure; //綠燈 static LED_TypeDef sLEDY_Structure; //黃燈 static LED_TypeDef sLEDR_Structure; //紅燈

5.初始化變量

/************************************************函數(shù)名稱 : LED_Data_Init功 能 : 數(shù)據(jù)初始化參 數(shù) : 無返 回 值 : 無作 者 : strongerHuang*************************************************/ static void LED_Data_Init(void){ /* 綠燈 */ sLEDG_Structure.Mode = LED_MODE_FLICKER; //初始化為閃爍 sLEDG_Structure.OffTimes = 50; //滅亮?xí)r間 sLEDG_Structure.OnTimes = 50; sLEDG_Structure.Counter = 0; //計(jì)數(shù)歸零 sLEDG_Structure.OffFun = LEDGreen_Off; //滅函數(shù)接口 sLEDG_Structure.OnFun = LEDGreen_On; //亮函數(shù)接口 /* 黃燈 */ sLEDY_Structure.Mode = LED_MODE_ON; //初始化為常亮 sLEDY_Structure.OffTimes = 0; //滅亮?xí)r間 sLEDY_Structure.OnTimes = 0; sLEDY_Structure.Counter = 0; //計(jì)數(shù)歸零 sLEDY_Structure.OffFun = LEDYellow_Off; //滅函數(shù)接口 sLEDY_Structure.OnFun = LEDYellow_On; //亮函數(shù)接口 /* 紅燈 */ sLEDR_Structure.Mode = LED_MODE_ON; //初始化為常亮 sLEDR_Structure.OffTimes = 0; //滅亮?xí)r間 sLEDR_Structure.OnTimes = 0; sLEDR_Structure.Counter = 0; //計(jì)數(shù)歸零 sLEDR_Structure.OffFun = LEDRed_Off; //滅函數(shù)接口 sLEDR_Structure.OnFun = LEDRed_On; //亮函數(shù)接口 /* 對外調(diào)用接口(例子) */ LEDG_Set(LED_MODE_FLICKER, 50, 50); LEDY_Set(LED_MODE_FLICKER, 50, 10); LEDR_Set(LED_MODE_FLICKER, 20, 30);}

這里重要的就是要初始化滅亮函數(shù)接口。

6.LEDs任務(wù)(線程)

/************************************************函數(shù)名稱 : LED_Task_Proc功 能 : 狀態(tài)燈任務(wù)程序參 數(shù) : pvParameters --- 可選參數(shù)返 回 值 : 無作 者 : strongerHuang*************************************************/ static void LED_Task_Proc(void *pvParameters){ static TickType_t xLastWakeTime; xLastWakeTime = xTaskGetTickCount(); for(;;) { //間隔固定計(jì)數(shù)周期(采樣時(shí)間) vTaskDelayUntil(&xLastWakeTime, LED_COUNT_PERIOD); /* 瀏覽LEDs */ LED_Scan(&sLEDG_Structure); LED_Scan(&sLEDY_Structure); LED_Scan(&sLEDR_Structure); }}

流程圖:

7.LED瀏覽(或者說處理)

/************************************************函數(shù)名稱 : LED_Scan功 能 : 狀態(tài)燈掃描(修改狀態(tài))參 數(shù) : LED_Struct --- 狀態(tài)燈數(shù)據(jù)結(jié)構(gòu)返 回 值 : 無作 者 : strongerHuang*************************************************/ static void LED_Scan(LED_TypeDef *LED_Struct){ /* 1.常滅模式 */ if(LED_MODE_OFF == LED_Struct->Mode) { LED_Struct->Status = LED_STATUS_OFF; //狀態(tài)置為"滅" LED_Struct->OffFun(); //滅燈 } /* 2.常亮模式 */ else if(LED_MODE_ON == LED_Struct->Mode) { LED_Struct->Status = LED_STATUS_ON; //狀態(tài)置為"亮" LED_Struct->OnFun(); //亮燈 } /* 3.閃爍模式 */ else if(LED_MODE_FLICKER == LED_Struct->Mode) { /* 在滅的狀態(tài) */ if(LED_STATUS_OFF == LED_Struct->Status) { LED_Struct->Counter++; if(LED_Struct->Counter >= LED_Struct->OffTimes) { LED_Struct->Counter = 0; LED_Struct->OnFun(); //亮燈 LED_Struct->Status = LED_STATUS_ON; //狀態(tài)置為"亮" } } /* 在亮的狀態(tài) */ else if(LED_STATUS_ON == LED_Struct->Status) { LED_Struct->Counter++; if(LED_Struct->Counter >= LED_Struct->OnTimes) { LED_Struct->Counter = 0; LED_Struct->OffFun(); //滅燈 LED_Struct->Status = LED_STATUS_OFF; //狀態(tài)置為"滅" } } else { LED_Struct->Status = LED_STATUS_OFF; //狀態(tài)置為"滅" } } /* 4.未知模式 */ else { LED_Struct->Status = LED_STATUS_OFF; //狀態(tài)置為"滅" LED_Struct->OffFun(); //滅燈 }}

源代碼工程下載地址:

鏈接:https://pan.baidu.com/s/1cNtwJDdCOfyYwsvKCclFyw

密碼:kk74

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

    關(guān)注

    146

    文章

    17984

    瀏覽量

    367035
  • LEDs
    +關(guān)注

    關(guān)注

    1

    文章

    42

    瀏覽量

    25839
  • RTOS
    +關(guān)注

    關(guān)注

    24

    文章

    851

    瀏覽量

    121181
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    508

    瀏覽量

    20220
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    同步任務(wù)開發(fā)指導(dǎo)

    同步任務(wù)是指在多個(gè)線程之間協(xié)調(diào)執(zhí)行的任務(wù),其目的是確保多個(gè)任務(wù)按照一定的順序和規(guī)則執(zhí)行,例如使用鎖來防止數(shù)據(jù)競爭。 同步任務(wù)的實(shí)現(xiàn)需要考慮多
    發(fā)表于 06-19 07:57

    工控一體機(jī)多線程任務(wù)調(diào)度優(yōu)化:聚徽分享破解工業(yè)復(fù)雜流程高效協(xié)同密碼

    在當(dāng)今工業(yè) 4.0 的浪潮下,工業(yè)生產(chǎn)正朝著高度自動(dòng)化、智能化的方向大步邁進(jìn)。生產(chǎn)流程日益復(fù)雜,眾多任務(wù)需要同時(shí)、高效地協(xié)同執(zhí)行,這對工業(yè)控制系統(tǒng)的核心 —— 工控一體機(jī)提出了前所未有的挑戰(zhàn)。多線程
    的頭像 發(fā)表于 05-28 14:06 ?169次閱讀

    RTOS如何在FX3中工作?

    大家好, 我正在使用 FX3 進(jìn)行一個(gè)項(xiàng)目。 我想知道 RTOS 調(diào)度是如何工作的。 我知道調(diào)用“CyU3PKernelEntry();”后 RTOS 就會開始工作。 如果我只注冊一個(gè)應(yīng)用程序線程。 我的
    發(fā)表于 05-06 13:20

    詳解RTOS中的Hook函數(shù)

    Hook函數(shù)是RTOS中的一個(gè)關(guān)鍵特性,通過該函數(shù),用戶可以增強(qiáng)對任務(wù)管理的控制,定義系統(tǒng)行為。
    的頭像 發(fā)表于 03-24 16:14 ?391次閱讀

    RTOS中的本地存儲指針使用

    本地存儲指針是RTOS中的一個(gè)重要特性,增強(qiáng)了任務(wù)管理和數(shù)據(jù)處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務(wù)或?qū)ο蟮臄?shù)據(jù)。通常與任務(wù)
    的頭像 發(fā)表于 02-28 16:33 ?918次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲指針使用

    EE-303:將VisualDSP線程安全庫與第三方RTOS配合使用

    電子發(fā)燒友網(wǎng)站提供《EE-303:將VisualDSP線程安全庫與第三方RTOS配合使用.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 14:09 ?0次下載
    EE-303:將VisualDSP<b class='flag-5'>線程</b>安全庫與第三方<b class='flag-5'>RTOS</b>配合使用

    使用任務(wù)通知提高RTOS應(yīng)用的效率

    在實(shí)時(shí)嵌入式系統(tǒng)中,性能和資源效率是決定設(shè)計(jì)成敗的關(guān)鍵因素。傳統(tǒng)的實(shí)時(shí)操作系統(tǒng)(RTOS)提供了如隊(duì)列、信號量和事件組機(jī)制,實(shí)現(xiàn)任務(wù)之間的同步和通信。FreeRTOS/SAFERTOS還提供一種方法可以使這些過程更快、更輕量化,即任務(wù)
    的頭像 發(fā)表于 12-27 14:54 ?699次閱讀

    socket 多線程編程實(shí)現(xiàn)方法

    是指在同一個(gè)進(jìn)程中運(yùn)行多個(gè)線程,每個(gè)線程可以獨(dú)立執(zhí)行任務(wù)。線程共享進(jìn)程的資源,如內(nèi)存空間和文件句柄,但每個(gè)線程有自己的程序計(jì)數(shù)器、寄存器集合
    的頭像 發(fā)表于 11-12 14:16 ?1016次閱讀

    使用M4的MCU(TM4C129X)建立webserver項(xiàng)目,網(wǎng)口指示狀態(tài)不對怎么解決?

    本人在使用M4的MCU(TM4C129X)建立webserver項(xiàng)目時(shí)候,有個(gè)問題想請教下,就是網(wǎng)口指示狀態(tài)不對。主要表現(xiàn)是是:網(wǎng)線沒有插上的時(shí)候,link-LED 和active-LED都
    發(fā)表于 11-05 07:28

    rtthread是搶占式的rtos,那么線程的timeout參數(shù)具體的作用是什么呢?

    查閱相關(guān)說明,rtthread是搶占式的rtos,那么線程的timeout參數(shù)具體的作用是什么呢, 假如線程A,B的優(yōu)先級分別是1和2,timeout是10ms。當(dāng)線程B 在運(yùn)行中,還
    發(fā)表于 09-27 08:39

    驅(qū)動(dòng)指示leds

    電子發(fā)燒友網(wǎng)站提供《驅(qū)動(dòng)指示leds.pdf》資料免費(fèi)下載
    發(fā)表于 09-18 11:50 ?0次下載
    驅(qū)動(dòng)指示<b class='flag-5'>燈</b><b class='flag-5'>leds</b>

    買藥秒送 JADE動(dòng)態(tài)線程池實(shí)踐及原理淺析

    ,我們通過3輪高保真壓測最終初步確定了線程池的核心參數(shù)。但我們?nèi)悦媾R一些保障系統(tǒng)穩(wěn)定性問題:如何監(jiān)控線程池運(yùn)行狀態(tài)?以及因流量飆升出現(xiàn)任務(wù)堆積和拒絕時(shí)能否實(shí)時(shí)報(bào)警,
    的頭像 發(fā)表于 09-04 11:11 ?1184次閱讀
    買藥秒送 JADE動(dòng)態(tài)<b class='flag-5'>線程</b>池實(shí)踐及原理淺析

    freertos和rtos區(qū)別是什么

    (Real-Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種特殊的操作系統(tǒng),它能夠?yàn)閷?shí)時(shí)任務(wù)提供確定性的響應(yīng)時(shí)間。RTOS 通常用于嵌入式系統(tǒng),如工業(yè)自動(dòng)化、汽車電子、醫(yī)療設(shè)備等領(lǐng)域
    的頭像 發(fā)表于 09-02 14:18 ?3029次閱讀

    簡單認(rèn)識RTOS實(shí)時(shí)操作系統(tǒng)

    RTOS(Real Time Operating System,實(shí)時(shí)操作系統(tǒng))是一種專門設(shè)計(jì)用于在嚴(yán)格時(shí)間限制內(nèi)處理任務(wù)的操作系統(tǒng)。它以其高實(shí)時(shí)性、多任務(wù)處理能力和資源管理能力在工業(yè)自動(dòng)化、醫(yī)療設(shè)備、航空航天、汽車電子等眾多領(lǐng)域
    的頭像 發(fā)表于 08-20 11:20 ?5263次閱讀

    一文掌握Python多線程

    使用線程可以把占據(jù)長時(shí)間的程序中的任務(wù)放到后臺去處理。
    的頭像 發(fā)表于 08-05 15:46 ?1266次閱讀