女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

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

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

3天內不再提示

LEDs狀態燈任務(線程)設計 (基于RTOS)

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

掃碼添加小助手

加入工程師交流群

我們學習MCU開發,大部分都是面向過程的開發,但實際項目一般要求我們有面向對象(模塊化)的方式來開發。

剛學習C語言開發的朋友,應該常常聽說面向對象,但實際對于面向對象開發可能還是不太了解。

為了初學者進一步理解,本文結合實際項目(LEDs狀態燈)給大家帶來比較基礎的模塊化設計。

Ⅰ關于C語言的模塊化

對于MCU的開發,大部分人都還是習慣性用的C語言,原因之一在于C語言具有高效的特點。

可以了解一下,許多操作系統的內核使用的編程語言,其實都用到了C語言,這就是C語言的優點,也是C語言這么多年不衰敗的原因。

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

C++語言本身就是面向對象的開發語言,定義一個類,可以包含許多成員。站在C語言的角度,可以理解成定義一個結構體,里面包含許多數據類型。如下面要說的LEDs數據結構體:

typedef struct { uint8_t Mode; //模式(常滅 常亮 閃爍) uint8_t Status; //當前狀態(滅 亮) uint16_t OffTimes; //滅時間(xLED_COUNT_PERIOD毫秒) uint16_t OnTimes; //亮時間 uint16_t Counter; //計數(計時) void (*OffFun)(void); //滅函數接口 void (*OnFun)(void); //亮函數接口 }LED_TypeDef;

可以看到,結構體里面包含整型變量,函數指針。

補充,指針函數與函數指針的區別:

1、指針函數:本質是一個函數,函數返回類型是某一類型的指針。

格式: 類型標識符 *函數名(參數表)

如:int *f(x,y);

2、函數指針:本質是一個指針,指向函數的指針變量。

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

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

Ⅱ為什么要模塊化設計

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

答案就是需要模塊化設計。

模塊化設計,包含底層驅動,中間接口函數,應用程序等。對于MCU級別的開發,為了規范,建議大家從底層設計到應用層設計都按照模塊化的方式來設計。

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

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

ⅢLEDs實例講述

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

1.描述

綠、黃、紅三個(可以自己添加許多個)LED狀態燈,可獨自實現常滅、常亮、閃爍三個模式。

閃爍:滅、亮時間可設置(提供函數接口修改)。

在一個線程(任務)里面執行。

3個LED不同亮滅時間效果:

2.數據結構

typedef struct { uint8_t Mode; //模式(常滅 常亮 閃爍) uint8_t Status; //當前狀態(滅 亮) uint16_t OffTimes; //滅時間(xLED_COUNT_PERIOD毫秒) uint16_t OnTimes; //亮時間 uint16_t Counter; //計數(計時) void (*OffFun)(void); //滅函數接口 void (*OnFun)(void); //亮函數接口 }LED_TypeDef;

為了方便理解,只使用一個數據結構(實際大的項目可能有多個包含,類似C++繼承關系)。

3.底層LED函數接口

void LEDGreen_Off(void);

void LEDGreen_On(void);

void LEDYellow_Off(void);

void LEDYellow_On(void);

void LEDRed_Off(void);

void LEDRed_On(void);

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

4.定義局部變量

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

5.初始化變量

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

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

6.LEDs任務(線程)

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

流程圖:

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

/************************************************函數名稱 : LED_Scan功 能 : 狀態燈掃描(修改狀態)參 數 : LED_Struct --- 狀態燈數據結構返 回 值 : 無作 者 : strongerHuang*************************************************/ static void LED_Scan(LED_TypeDef *LED_Struct){ /* 1.常滅模式 */ if(LED_MODE_OFF == LED_Struct->Mode) { LED_Struct->Status = LED_STATUS_OFF; //狀態置為"滅" LED_Struct->OffFun(); //滅燈 } /* 2.常亮模式 */ else if(LED_MODE_ON == LED_Struct->Mode) { LED_Struct->Status = LED_STATUS_ON; //狀態置為"亮" LED_Struct->OnFun(); //亮燈 } /* 3.閃爍模式 */ else if(LED_MODE_FLICKER == LED_Struct->Mode) { /* 在滅的狀態 */ 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; //狀態置為"亮" } } /* 在亮的狀態 */ 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; //狀態置為"滅" } } else { LED_Struct->Status = LED_STATUS_OFF; //狀態置為"滅" } } /* 4.未知模式 */ else { LED_Struct->Status = LED_STATUS_OFF; //狀態置為"滅" LED_Struct->OffFun(); //滅燈 }}

源代碼工程下載地址:

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

密碼:kk74

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

    關注

    146

    文章

    17955

    瀏覽量

    365783
  • LEDs
    +關注

    關注

    1

    文章

    42

    瀏覽量

    25815
  • RTOS
    +關注

    關注

    24

    文章

    849

    瀏覽量

    121070
  • 線程
    +關注

    關注

    0

    文章

    508

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    同步任務開發指導

    同步任務是指在多個線程之間協調執行的任務,其目的是確保多個任務按照一定的順序和規則執行,例如使用鎖來防止數據競爭。 同步任務的實現需要考慮多
    發表于 06-19 07:57

    工控一體機多線程任務調度優化:聚徽分享破解工業復雜流程高效協同密碼

    在當今工業 4.0 的浪潮下,工業生產正朝著高度自動化、智能化的方向大步邁進。生產流程日益復雜,眾多任務需要同時、高效地協同執行,這對工業控制系統的核心 —— 工控一體機提出了前所未有的挑戰。多線程
    的頭像 發表于 05-28 14:06 ?156次閱讀

    RTOS如何在FX3中工作?

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

    詳解RTOS中的Hook函數

    Hook函數是RTOS中的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?372次閱讀

    RTOS中的本地存儲指針使用

    本地存儲指針是RTOS中的一個重要特性,增強了任務管理和數據處理能力。在RTOS上下文中,本地存儲是指存儲在本地的特定任務或對象的數據。通常與任務
    的頭像 發表于 02-28 16:33 ?904次閱讀
    <b class='flag-5'>RTOS</b>中的本地存儲指針使用

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

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

    使用任務通知提高RTOS應用的效率

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

    socket 多線程編程實現方法

    是指在同一個進程中運行多個線程,每個線程可以獨立執行任務線程共享進程的資源,如內存空間和文件句柄,但每個線程有自己的程序計數器、寄存器集合
    的頭像 發表于 11-12 14:16 ?991次閱讀

    使用M4的MCU(TM4C129X)建立webserver項目,網口指示狀態不對怎么解決?

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

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

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

    驅動指示leds

    電子發燒友網站提供《驅動指示leds.pdf》資料免費下載
    發表于 09-18 11:50 ?0次下載
    驅動指示<b class='flag-5'>燈</b><b class='flag-5'>leds</b>

    買藥秒送 JADE動態線程池實踐及原理淺析

    ,我們通過3輪高保真壓測最終初步確定了線程池的核心參數。但我們仍面臨一些保障系統穩定性問題:如何監控線程池運行狀態?以及因流量飆升出現任務堆積和拒絕時能否實時報警,
    的頭像 發表于 09-04 11:11 ?1168次閱讀
    買藥秒送 JADE動態<b class='flag-5'>線程</b>池實踐及原理淺析

    freertos和rtos區別是什么

    (Real-Time Operating System,實時操作系統)是一種特殊的操作系統,它能夠為實時任務提供確定性的響應時間。RTOS 通常用于嵌入式系統,如工業自動化、汽車電子、醫療設備等領域
    的頭像 發表于 09-02 14:18 ?2945次閱讀

    簡單認識RTOS實時操作系統

    RTOS(Real Time Operating System,實時操作系統)是一種專門設計用于在嚴格時間限制內處理任務的操作系統。它以其高實時性、多任務處理能力和資源管理能力在工業自動化、醫療設備、航空航天、汽車電子等眾多領域
    的頭像 發表于 08-20 11:20 ?5171次閱讀

    一文掌握Python多線程

    使用線程可以把占據長時間的程序中的任務放到后臺去處理。
    的頭像 發表于 08-05 15:46 ?1242次閱讀
    主站蜘蛛池模板: 仁化县| 新乡县| 苍梧县| 梅河口市| 察哈| 邯郸市| 长子县| 荔波县| 同德县| 阜阳市| 临安市| 荣成市| 澄迈县| 阳信县| 英吉沙县| 昌图县| 桐城市| 梁山县| 温州市| 崇文区| 白水县| 武定县| 石河子市| 阿瓦提县| 眉山市| 晴隆县| 利津县| 万载县| 兴隆县| 浪卡子县| 寻乌县| 滦南县| 石嘴山市| 莱西市| 平罗县| 洪雅县| 峡江县| 延安市| 文成县| 玉林市| 家居|