chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

一種軟件框架,實現(xiàn)RTOS的部分功能

STM32嵌入式開發(fā) ? 來源:gitee ? 作者:gitee ? 2022-04-08 10:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

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

主要功能

  • 支持模塊自動化管理,并提供不同優(yōu)先等級初始化聲明接口
  • 支持任務(wù)輪詢管理,通過簡單的宏聲明即可實現(xiàn),不需要復(fù)雜的聲明調(diào)用。
  • 支持低功耗管理,休眠與喚醒通知。
  • 支持命令行解析,命令注冊與執(zhí)行。
  • blink設(shè)備支持,統(tǒng)一管理LED、震動馬達、蜂鳴器

使用說明

完整的代碼可以參考工程文件,系統(tǒng)開發(fā)平臺如下:

MCU:STM32F401RET6

IDE:IAR 7.4或者Keil MDK 4.72A

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

使用此模塊前需要系統(tǒng)提供滴答定時器,用于驅(qū)動任務(wù)輪詢作業(yè)。(參考platform.c)

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

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

staticvoidkey_init(void)
{
/*dosomething*/
}

staticvoidkey_scan(void)
{
/*dosomething*/
}

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

命令管理器(cli)

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

命令格式

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

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

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

系統(tǒng)默認命令

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

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

適配命令管理器

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

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

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

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

cli_enable(&cli);

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

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

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

命令注冊

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

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

低功耗管理器(pm)

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

如何適配

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

/*低功耗適配器---------------------------------------------------------*/
typedefstruct{
/**
*@brief系統(tǒng)最大休眠時長(ms)
*/
unsignedintmax_sleep_time;
/**
*@brief進入休眠狀態(tài)
*@param[in]time-期待休眠時長(ms)
*@retval實際休眠時長
*@note休眠之后需要考慮兩件事情,1個是需要定時起來給喂看門狗,否則會在休眠
*期間發(fā)送重啟.另外一件事情是需要補償休眠時間給系統(tǒng)滴答時鐘,否則會
*造成時間不準(zhǔn)。
*/
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文件進行編譯即可使用。

注冊低功耗設(shè)備

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

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

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

對于第一種情況,將按鍵配置為邊沿中斷喚醒即可,以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);/*創(chuàng)建按鍵*/
}

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

//參考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)的設(shè)備(led, motor, buzzer)管理

使用步驟:

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

或者通過"module"模塊的任務(wù)注冊來實現(xiàn)

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

LED驅(qū)動

blink_dev_tled;//定義led設(shè)備

/*
*@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);//創(chuàng)建led設(shè)備

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

按鍵管理模塊

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

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

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

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

}
}

//讀取鍵值(假設(shè)按鍵輸出口為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);
//創(chuàng)建1個按鍵
key_create(&key,read_key,key_event);
}

審核編輯 :李倩


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

    關(guān)注

    147

    文章

    18779

    瀏覽量

    392819
  • 自動化
    +關(guān)注

    關(guān)注

    30

    文章

    5915

    瀏覽量

    89802
  • 軟件框架
    +關(guān)注

    關(guān)注

    0

    文章

    22

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    一種無OS的MCU實用軟件框架

    介紹一種無OS的MCU實用軟件框架,包括任務(wù)輪詢管理,命令管理器、低功耗管理、環(huán)形緩沖區(qū)等實用模塊。系統(tǒng)中廣泛利用自定義段技術(shù)減少各個模塊間的耦合關(guān)系,大大提供程序的可維護性。 主要功能
    發(fā)表于 01-08 06:58

    搞嵌入式的為啥要定要學(xué)習(xí)RTOS

    (); } } 輪詢系統(tǒng)是一種非常簡單的軟件結(jié)構(gòu),通常只適用于那些只需要順序執(zhí)行代碼且不需要外部事件來驅(qū)動的就能完成的事情。在代碼清單中,如果只是實現(xiàn)LED翻轉(zhuǎn),串口輸出,液晶顯示等這些操作,那么使用輪詢系統(tǒng)將會
    發(fā)表于 01-05 06:42

    如何在Zephyr RTOS實現(xiàn)延時和計時函數(shù)

    在實時操作系統(tǒng)(RTOS)中,時間管理是核心功能。無論是任務(wù)調(diào)度、超時控制,還是周期性事件,延時和計時機制都扮演著至關(guān)重要的角色。Zephyr RTOS作為
    的頭像 發(fā)表于 12-26 10:32 ?4221次閱讀
    如何在Zephyr <b class='flag-5'>RTOS</b>中<b class='flag-5'>實現(xiàn)</b>延時和計時函數(shù)

    RTOS在嵌入式開發(fā)中的作用

    嵌入式系統(tǒng)中,有很多方式實現(xiàn)任務(wù)調(diào)度。功能有限的小系統(tǒng)中,無限循環(huán)足夠實現(xiàn)系統(tǒng)功能。當(dāng)軟件設(shè)計變得龐大且復(fù)雜時,設(shè)計師應(yīng)該考慮使用
    發(fā)表于 12-26 07:53

    使用RTOS時需要注意的幾點內(nèi)容分享

    的處理器速度總是有幫助的,多內(nèi)核平臺也能改善響應(yīng)速度。對開發(fā)人員來說,竅門在于把系統(tǒng)需求與硬件和軟件匹配起來,然后才是RTOS在嵌入式應(yīng)用中的重要性。 RTOS可以
    發(fā)表于 12-23 06:34

    選擇RTOS的要點

    的響應(yīng)要求。更快的處理器速度總是有幫助的,多內(nèi)核平臺也能改善響應(yīng)速度。對開發(fā)人員來說,竅門在于把系統(tǒng)需求與硬件和軟件匹配起來,然后才是RTOS在嵌入式應(yīng)用中的重要性。 RTOS
    發(fā)表于 12-12 08:00

    如何在 RTOS 中處理微控制器的低功耗特性

    基于 RTOS 的低功耗設(shè)計思路。 越來越多的嵌入式產(chǎn)品基于 RTOS 作為軟件平臺, 有些產(chǎn)品對低功耗的要求也越來越高, 本文討論下如何在 RT
    發(fā)表于 12-12 07:07

    學(xué)習(xí)RTOS的意義?

    對于嵌入式軟件工程師,學(xué)習(xí)RTOS非常有必要。 1. 項目需要 隨著產(chǎn)品要實現(xiàn)功能越來越多,單純的裸機系統(tǒng)已經(jīng)不能完美地解決問題,反而會使編程變得更加復(fù)雜,如果想降低編程的難度,就
    發(fā)表于 11-27 08:16

    復(fù)雜的軟件算法硬件IP核的實現(xiàn)

    的函數(shù)功能的簡短的描述。 HASM 語言包含了兩結(jié)構(gòu),一種功能一種是結(jié)構(gòu)域。 功能域負
    發(fā)表于 10-30 07:02

    請問STM32如何移植Audio框架?

    最近在學(xué)習(xí)音頻解碼,想用下Audio框架。 1、這個該如何移植到自己創(chuàng)建的BSP并對接到device框架中?看了官方移植文檔沒有對沒有對該部分的描述。 2、我只想
    發(fā)表于 09-25 07:17

    一種適用于動態(tài)環(huán)境的自適應(yīng)先驗場景-對象SLAM框架

    由于傳統(tǒng)視覺SLAM在動態(tài)場景中容易會出現(xiàn)嚴重的定位漂移,本文提出了一種新穎的基于場景-對象的可靠性評估框架,該框架通過當(dāng)前幀質(zhì)量指標(biāo)以及相對于可靠參考幀的場景變化,全面評估SLAM的穩(wěn)定性。
    的頭像 發(fā)表于 08-19 14:17 ?765次閱讀
    <b class='flag-5'>一種</b>適用于動態(tài)環(huán)境的自適應(yīng)先驗場景-對象SLAM<b class='flag-5'>框架</b>

    RTOS怎么實現(xiàn)共享內(nèi)存?

    K230的RTOS支持POSIX標(biāo)準(zhǔn)的共享內(nèi)存嗎 我嘗試使用卻失敗 還是說需要源碼部分配置的開啟才可以使用 求教大佬
    發(fā)表于 08-04 08:06

    代PX5 RTOS具有哪些優(yōu)勢

    許多古老的RTOS設(shè)計至今仍在使用,包括Zephyr(1980年代)、Nucleus(1990年代)和FreeRTOS(2003年)。所有這些舊設(shè)計都有專有的API,通常更大、更慢,并且缺乏下RTOS的必要安全認證和
    的頭像 發(fā)表于 06-19 15:06 ?985次閱讀

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

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

    STM32如何移植Audio框架?

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