在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

一種軟件框架,實現RTOS的部分功能

STM32嵌入式開發 ? 來源:gitee ? 作者:gitee ? 2022-04-08 10:49 ? 次閱讀

介紹

一種無OS的MCU實用軟件框架,包括任務輪詢管理,命令管理器、低功耗管理、環形緩沖區等實用模塊。系統中廣泛利用自定義段技術減少各個模塊間的耦合關系,大大提供程序的可維護性。

主要功能

  • 支持模塊自動化管理,并提供不同優先等級初始化聲明接口
  • 支持任務輪詢管理,通過簡單的宏聲明即可實現,不需要復雜的聲明調用。
  • 支持低功耗管理,休眠與喚醒通知。
  • 支持命令行解析,命令注冊與執行。
  • blink設備支持,統一管理LED、震動馬達、蜂鳴器

使用說明

完整的代碼可以參考工程文件,系統開發平臺如下:

MCU:STM32F401RET6

IDE:IAR 7.4或者Keil MDK 4.72A

任務初始化及任務輪詢管理(module)

使用此模塊前需要系統提供滴答定時器,用于驅動任務輪詢作業。(參考platform.c)

//定時器中斷(提供系統滴答)
voidSysTick_Handler(void)
{
systick_increase(SYS_TICK_INTERVAL);//增加系統節拍
}

注冊初始化入口及任務(參考自key_task.c)

staticvoidkey_init(void)
{
/*dosomething*/
}

staticvoidkey_scan(void)
{
/*dosomething*/
}

module_init("key",key_init);//注冊按鍵初始化接口
driver_register("key",key_scan,20);//注冊按鍵任務(20ms輪詢1次)

命令管理器(cli)

適用于在線調試、參數配置等(參考使用cli_task.c),用戶可以通過串口輸出命令行控制設備行為、查詢設備狀態等功能。

命令格式

cli支持的命令行格式如下:

< param1> < param2> < paramn> < > ,< param1>, < param2>, < paramn>, < >

每行命令包含一個命令名稱+命令參數(可選),命令名稱及參數可以通過空格或者','進行分隔。

系統默認命令

cli系統自帶了2條默認命令,分別是"?"與"help"命令,輸入他們可以列出當前系統包含的命令列表,如下所示:

?-aliasfor'help'
help-listallcommand.
pm-Lowpowercontrolcommand
reset-resetsystem
sysinfo-showsysteminfomation.

適配命令管理器

完整的例子可以參考cli_task.c.

staticcli_obj_tcli;/*命令管理器對象*/

/*
*@brief命令行任務初始化
*@returnnone
*/
staticvoidcli_task_init(void)
{
cli_port_tp={tty.write,tty.read};/*讀寫接口*/

cli_init(&cli,&p);/*初始化命令行對象*/

cli_enable(&cli);

cli_exec_cmd(&cli,"sysinfo");/*顯示系統信息*/
}

/*
*@brief命令行任務處理
*@returnnone
*/
staticvoidcli_task_process(void)
{
cli_process(&cli);
}

module_init("cli",cli_task_init);
task_register("cli",cli_task_process,10);/*注冊命令行任務*/

命令注冊

以復位命令為例(參考cmd_devinfo.c):

#include"cli.h"
//...
/*
*@brief復位命令
*/
intdo_cmd_reset(structcli_obj*o,intargc,char*argv[])
{
NVIC_SystemReset();
return0;
}cmd_register("reset",do_cmd_reset,"resetsystem");

低功耗管理器(pm)

控制間歇運行,降低系統功耗。其基本的工作原理是通過輪詢系統中各個模塊是否可以允許系統進入低功耗。實際上這是一種判決機制,所有模塊都具有有票否決權,即只要有一個模塊不允許休眠,那么系統就不會進入休眠狀態。pm模塊在休眠前會統計出各個模塊會返回最小允許休眠時長,并以最小休眠時長為單位進行休眠。

如何適配

使用前需要通過pm_init進行初始化適配,并提供當前系統允許的最大休眠時間,進入休眠的函數接口,基本的接口定義如下:

/*低功耗適配器---------------------------------------------------------*/
typedefstruct{
/**
*@brief系統最大休眠時長(ms)
*/
unsignedintmax_sleep_time;
/**
*@brief進入休眠狀態
*@param[in]time-期待休眠時長(ms)
*@retval實際休眠時長
*@note休眠之后需要考慮兩件事情,1個是需要定時起來給喂看門狗,否則會在休眠
*期間發送重啟.另外一件事情是需要補償休眠時間給系統滴答時鐘,否則會
*造成時間不準。
*/
unsignedint(*goto_sleep)(unsignedinttime);
}pm_adapter_t;
voidpm_init(constpm_adapter_t*adt);

voidpm_enable(void);

voidpm_disable(void);

voidpm_process(void);

完成的使用例子可以參考platform-lowpower.c,默認情況下是禁用低功耗功能的,讀者可以去除工程中原來不帶低功耗版本的platform.c,并加入platform-lowpower.c文件進行編譯即可使用。

注冊低功耗設備

以按鍵掃描為例,正常情況下,如果按鍵沒有按下,那么系統休眠可以進入休眠狀態,對按鍵功能是沒有影響的。如果按鍵按下時,那么系統需要定時喚醒并輪詢按鍵任務。

所以在一個低功耗系統下,為了不影響按鍵實時性需要處理好兩個事情:

  1. 系統休眠狀態下,如果有按鍵按下,那系統系統應立即喚醒,以便處理接下來的掃描工作。
  2. 如果按鍵按下時,系統可以進入休眠,但需要定時喚醒起來輪詢按鍵任務。

對于第一種情況,將按鍵配置為邊沿中斷喚醒即可,以STM32F4為例(參考key_task.c),它支持外部中斷喚醒功能。

/*
*@brief按鍵io初始化
*PC0->key;
*@returnnone
*/
staticvoidkey_io_init(void)
{
/*EnableGPIOAclock*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);

gpio_conf(GPIOC,GPIO_Mode_IN,GPIO_PuPd_UP,GPIO_Pin_0);

//低功耗模式下,為了能夠檢測到按鍵,配置為中斷喚醒
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC,EXTI_PinSource0);
exti_conf(EXTI_Line0,EXTI_Trigger_Falling,ENABLE);
nvic_conf(EXTI0_IRQn,0x0F,0x0F);

key_create(&key,readkey,key_event);/*創建按鍵*/
}

對于第二種情況,可以通過pm_dev_register來處理,當系統請求休眠時,如果此時按鍵按下,則返回下次喚醒時間即可,如下面的例子所示。

//參考key_task.c
#include"pm.h"
/*
*@brief休眠通知
*/
staticunsignedintkey_sleep_notify(void)
{
returnkey_busy(&key)||readkey()?20:0;/*非空閑時20ms要喚醒1次*/
}pm_dev_register("key",NULL,key_sleep_notify,NULL);

blink模塊

具有閃爍特性(led, motor, buzzer)的設備(led, motor, buzzer)管理

使用步驟:

  • 需要系統提供滴答時鐘,blick.c中是通過get_tick()接口獲取,依賴module模塊
  • 需要在任務中定時進行輪詢

或者通過"module"模塊的任務注冊來實現

task_register("blink",blink_dev_process,50);//50ms輪詢1次

LED驅動

blink_dev_tled;//定義led設備

/*
*@brief紅色LED控制(GPIOA.8)
*@param[in]on-亮滅控制
*/
staticvoidled_ctrl(inton)
{
if(on)
GPIOA->ODR|=(1<8);
else
GPIOA->ODR&=~(1<8);
}

/*
*@briefled初始化程序
*/
voidled_init(void)
{
led_io_init(void);//ledio初始化
blink_dev_create(&led,led_ctrl);//創建led設備

blink_dev_ctrl(&led,50,100,0);//快閃(50ms亮,100ms滅)
}

按鍵管理模塊

類似blink模塊,使用之前有兩個注意事項:

  • 需要系統提供滴答時鐘,key.c中是通過get_tick()接口獲取,依賴module模塊
  • 需要在任務中定時進行輪詢
key_tkey;//定義按鍵管理器

/*
*@brief按鍵事件
*@param[in]type-按鍵類型(KEY_PRESS,KEY_LONG_DOWN,KEY_LONG_UP)
*@param[in]duration-長按持續時間
*/
voidkey_event(inttype,unsignedintduration)
{
if(type==KEY_PRESS){//短按

}elseif(type==KEY_LONG_DOWN){//長按

}
}

//讀取鍵值(假設按鍵輸出口為STM32MCUPA8)
intread_key(void)
{
returnGPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==Bit_RESET;
}

/*
*@brief按鍵初始化
*/
voidkey_init(void)
{
//打開GPIO時鐘
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
//配置成輸入模式
gpio_conf(GPIOA,GPIO_Mode_IN,GPIO_PuPd_NOPULL,GPIO_Pin_8);
//創建1個按鍵
key_create(&key,read_key,key_event);
}

審核編輯 :李倩


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

    關注

    146

    文章

    17758

    瀏覽量

    358916
  • 自動化
    +關注

    關注

    29

    文章

    5726

    瀏覽量

    81330
  • 軟件框架
    +關注

    關注

    0

    文章

    22

    瀏覽量

    9990
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    一種實時多線程VSLAM框架vS-Graphs介紹

    針對現有VSLAM系統語義表達不足、地圖可解釋性差的問題,本文提出vS-Graphs,一種實時多線程VSLAM框架。該方案顯著提升了重建地圖的語義豐富度、可解釋性及定位精度。實驗表明
    的頭像 發表于 04-19 14:07 ?192次閱讀
    <b class='flag-5'>一種</b>實時多線程VSLAM<b class='flag-5'>框架</b>vS-Graphs介紹

    STM32如何移植Audio框架

    最近在學習音頻解碼,想用下Audio框架。 1、這個該如何移植到自己創建的BSP并對接到device框架中?看了官方移植文檔沒有對沒有對該部分的描述。 2、我只想
    發表于 04-01 08:08

    Flexible Safety RTOS的技術特征

    Embedded Office的Flexible Safety RTOS是專為具有嚴格功能安全要求的嵌入式系統量身定制的、先進的實時操作系統。該RTOS專為工業自動化、汽車、鐵路和醫療設備等行業而設
    的頭像 發表于 01-07 11:29 ?532次閱讀

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

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

    一種實現亞毫秒定時分辨率的RTOS新方法

    擴展。RTOS不應該能夠管理整個應用程序的時間嗎,不管這個時間是秒還是微秒? 對于嵌入式系統領域的開發和管理人員來說,平衡時間精度和能源效率可能是項持續的斗爭。隨著應用的發展,無
    的頭像 發表于 12-17 13:58 ?386次閱讀
    <b class='flag-5'>一種</b><b class='flag-5'>實現</b>亞毫秒定時分辨率的<b class='flag-5'>RTOS</b>新方法

    SSM框架的源碼解析與理解

    SSM框架(Spring + Spring MVC + MyBatis)是一種在Java開發中常用的輕量級企業級應用框架。它通過整合Spring、Spring MVC和MyBatis三個框架
    的頭像 發表于 12-17 09:20 ?731次閱讀

    如何實現軟件的emulate功能 emulation和虛擬化的區別是什么

    和應用場景有著明顯的區別。本文將探討這兩個概念的定義、實現方式以及它們之間的主要差異。 1. 軟件的Emulate功能 軟件的emulate功能
    的頭像 發表于 12-05 15:35 ?738次閱讀

    一種面向飛行試驗的數據融合框架

    天地氣動數據致性,針對某外形飛行試驗數據開展了典型對象的天地氣動數據融合方法研究。結合數據挖掘的隨機森林方法,本文提出了一種面向飛行試驗的數據融合框架,通過引入地面風洞試驗氣動數據,實現
    的頭像 發表于 11-27 11:34 ?639次閱讀
    <b class='flag-5'>一種</b>面向飛行試驗的數據融合<b class='flag-5'>框架</b>

    全志T113雙核異構處理器的使用基于Tina Linux5.0——RTOS系統定制開發

    8、RTOS系統定制開發 此處以在rtos/components/aw目錄下創建個簡單的軟件包為例,幫助客戶了解RTOS環境,為
    發表于 11-22 09:36

    freertos和rtos區別是什么

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

    RTOS與Linux有什么區別

    RTOS(Real-Time Operating System,實時操作系統)與Linux是兩在不同應用場景下發揮重要作用的操作系統,它們在設計理念、功能特性、應用場景以及性能表現等方面存在顯著差異。以下是對
    的頭像 發表于 08-20 16:05 ?6029次閱讀

    RTOS的特性和類型

    實時操作系統(RTOS)是一種可運行實時計算應用程序的軟件平臺,用于處理具有明確時間約束的事件和數據。與通用操作系統(GPOS)不同,RTOS必須在有限的硬件資源上調度應用程序之間的處
    的頭像 發表于 08-20 11:29 ?1166次閱讀

    RTOS開發最佳實踐

    基于RTOS編寫應用程序時,有些要注意事項。在本節中,您將學習RTOS開發最佳實踐,例如POSIX合規性、安全性和功能安全認證。
    的頭像 發表于 08-20 11:24 ?725次閱讀

    rup是一種什么模型

    RUP(Rational Unified Process,統建模語言)是一種軟件開發過程模型,它是一種迭代和增量的軟件開發方法。RUP是由
    的頭像 發表于 07-09 10:13 ?2051次閱讀

    ESP8266如何保護時間關鍵部分免受RTOS中斷的影響?

    /taskENABLE_INTERRUPTS 對來保護關鍵部分,但問題仍然存在。在這種情況下,調度程序仍然可以中斷關鍵部分。嘗試禁用中斷和使用taskENTER_CRITICAL根本不起作用。 ESP8266_RTOS_SDK
    發表于 07-09 06:16
    主站蜘蛛池模板: 爱爱免费小视频 | 日韩一区二区视频 | 中日韩一级片 | 一级黄色毛片播放 | 日本人xxxxxxxxxⅹ68 | 亚洲精品福利你懂 | 狠狠色伊人亚洲综合第8页 狠狠色依依成人婷婷九月 狠狠色影院 | 亚洲人成电影在线播放 | 日韩电影毛片 | 色多多视频在线 | 国产福利资源在线 | 免费观看黄视频 | 成人窝窝午夜看片 | 四虎免费看黄 | 亚洲免费黄色网 | 免费又爽又黄1000禁片 | 久久精品免视看国产成人2021 | 亚洲人成影院在线高清 | 午夜视频高清在线aaa | 性欧美乱又伦 | 亚洲综合校园春色 | 91大神免费视频 | 五月婷婷丁香综合 | 午夜欧美性视频在线播放 | 一级a毛片免费观看 | 日韩不卡毛片 | 欧美一级看片免费观看视频在线 | 五月婷婷六月激情 | 欧美另类网 | 色先锋av资源中文字幕 | 国产你懂 | 女人双腿搬开让男人桶 | 色噜噜久久 | 给我一个可以看片的www日本 | 91久久天天躁狠狠躁夜夜 | 69国产成人综合久久精品 | 九九国产精品视频 | 狠狠干夜夜 | 美女黄频 | 国产亚洲精品久久久久久午夜 | 美女h片 |