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

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

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

基于RT-Thread操作系統(tǒng)軟件框架設計思路

嵌入式應用開發(fā) ? 來源:嵌入式應用開發(fā) ? 作者:嵌入式應用開發(fā) ? 2022-07-07 10:09 ? 次閱讀

項目中使用到rt—thread就會涉及到對操作系統(tǒng)的一個軟件框架的搭建過程思路,這里拿已經(jīng)完成城的項目做一些分享,希望對讀者有些啟發(fā)。

項目要求:讀取溫濕度,串口打印,數(shù)據(jù)定時發(fā)送,lcd顯示,平臺上傳,按鍵設置,SD 卡存儲等

系統(tǒng)涉及到的硬件由以下幾部分組成:

1.交互輸入部分:按鍵

2. 輸出部分:TFTLCD屏幕顯示,SD卡存儲,led燈報警

3. 傳感器采集:DHT11溫濕度采集

4. 通訊部分:串口,wifi模塊

5. 計時部分:RTC時鐘計時

在這里插入圖片描述硬件連接示意圖

根據(jù)硬件的連接與系統(tǒng)要求實現(xiàn)的功能來看:

1.首先要做的就是根據(jù)硬件電路寫好底層驅(qū)動(HAL)

2.進行函數(shù)的劃分與封裝,將應用層需要的函數(shù)封裝好

3.進行中斷函數(shù)的撰寫與封裝(可以將該這一步與第2步同時進行)

4.由于中斷的優(yōu)先級比任何的線程優(yōu)先級都要高因此需要統(tǒng)籌線程與中斷的關系

5.繼續(xù)線程的規(guī)劃,線程優(yōu)先級定義及應用層函數(shù)的撰寫

軟件程序結構:

在這里插入圖片描述

項目系統(tǒng)要求定期發(fā)送數(shù)據(jù)到平臺,其中在定時器超函數(shù)中周期性采集溫濕度信息,并發(fā)送消息隊列到處理緩存?zhèn)鞲衅餍畔⒌木€程和超溫處理線程,同時發(fā)布采集到一次傳感器的事件。

超溫處理線程接收消息判斷是否超過溫度,wifi模塊通過串口2將溫濕度信息發(fā)送給wifi模塊,由wifi模塊實時上傳到服務器。同時串口溫度上傳任務同時接收定時器發(fā)送的事件和PC機通過串口1發(fā)送的獲取溫度標志所觸發(fā)的事件。當采集到傳感器信息且上位機要求獲取溫濕度信息的事情同時發(fā)生時,通過串口1向PC發(fā)送溫濕度信息。由于SD卡存儲緩慢,所以由溫濕度信息緩存線程在內(nèi)存池中申請內(nèi)存,并將獲取到的溫濕度信息緩存到內(nèi)存中,同時更新LCD曲線繪制的歷史溫濕度信息緩存。

LCD處理線程處理IO口中斷發(fā)送過來的標志信息,并據(jù)此顯示相應的菜單,溫度濕度信息,顯示所設定采樣頻率與閾值的情況等。

SD卡存儲任務作為后臺任務,從緩存存儲溫濕度信息的內(nèi)存中讀取溫濕度信息,并通過FATFS文件系統(tǒng)將相應的溫濕度信息存入SD卡,同時根據(jù)每片內(nèi)存的頭部時間信息以及定時器采樣頻率推算本片內(nèi)存中其他數(shù)據(jù)的時間信息,并將采樣時間一起保存到SD卡中。在存儲完一片內(nèi)存片后,釋放該內(nèi)存到內(nèi)存池之中。流程圖如下所示:

在這里插入圖片描述

代碼部分這里貼出主函數(shù)中的基本邏輯框架:

int main(void)
{	
    
  /***********************掛載SD卡并打開文件*******************************/
	while(SD_Init())//檢測不到SD卡
	{
		LCD_ShowString(30,150,200,16,16,"SD Card Error!");				
		LCD_ShowString(50,150,200,16,16,"Please Check! ");
	}
  
  //*****************消息隊列創(chuàng)建	*****************************************/
  //申請內(nèi)存池
	//初始化控制塊
    rt_mp_init(&tem_mp, "temmp", &temmempool[0], sizeof(temmempool), mem_slice);
	  rt_mp_init(&hum_mp, "hummp", &hummempool[0], sizeof(hummempool), mem_slice);
	    rt_err_t result2;
    /* 初始化消息隊列 */
    result= rt_mq_init(& mq_DHT11_tem,
                        " mq_DHT11_tem",
                        &msg_DHT11_pool_tem[0],               /* msg_pool */
                        sizeof(tem),                          /* 每個消息的大小*/
                        sizeof(msg_DHT11_pool_tem),                     /* msg_pool大小*/
                        RT_IPC_FLAG_FIFO); 
    result2 = rt_mq_init(& mq_DHT11_hum,
                        " mq_DHT11_hum",
                        &msg_DHT11_pool_hum[0],               /* msg_pool */
                        sizeof(hum),                          /* 每個消息的大小*/
                        sizeof(msg_DHT11_pool_hum),                     /* msg_pool大小*/
                        RT_IPC_FLAG_FIFO); 
   
	//定時器線程
    /* DHT11 TIMER */		
    DH11_timer = rt_timer_create("DHT11_get", timeout1,
                             RT_NULL, samp_freq,
                             RT_TIMER_FLAG_PERIODIC);
    /* 啟動*/
    if (DH11_timer  != RT_NULL) 
			  flag=rt_timer_start(DH11_timer );	
	  if(flag==RT_EOK)
			 rt_kprintf("DH11_timer start successfull\n");	

	//***********************事件處理線程*******************************************/
		uart_deal_event =                          /* 線程控制塊指針 */
    rt_thread_create( "usart_deal_event",              /* 線程名字 */
                      uart_deal_thread_entry,   /* 線程入口函數(shù) */
                      RT_NULL,             /* 線程入口函數(shù)參數(shù) */
                      256,                 /* 線程棧大小 */
                      2,                   /* 線程的優(yōu)先級 */
                      20);                 /* 線程時間片 */
                   
    /* 啟動線程,開啟調(diào)度 */
    if (uart_deal_event != RT_NULL)
        rt_thread_startup(uart_deal_event);
    else
         rt_kprintf("led_thread_creat_error");
		
////*******************創(chuàng)建內(nèi)存任務線程***********************************************************//
   for (j = 0; j < 48; j++) ptr[j] = RT_NULL;

    //創(chuàng)建線程
    recevDHT11 = rt_thread_create("recevDHT11", recevDHT11_entry, RT_NULL,
                            512,
                            4 ,20);
		
    if (recevDHT11 != RT_NULL)
         rt_thread_startup(recevDHT11);

//*******************創(chuàng)建釋放內(nèi)存堆寫入SD卡線程***********************************************************//	
    thread_mp_release = rt_thread_create("thread_mp_release", thread_mp_release_entry, RT_NULL,
                            1024,
                            4, 20);
    if (thread_mp_release != RT_NULL)
        rt_thread_startup(thread_mp_release);
		
///*******************創(chuàng)LCD 顯示繪圖線程***********************************************************//	
		lcd_show= rt_thread_create("lcd_showwave", lcd_show_entry, RT_NULL,
                            512,
                            3, 30);
    if (lcd_show != RT_NULL)
         rt_thread_startup(lcd_show );
//*******************超溫處理線程的創(chuàng)建***********************************************************//			
		
		over_temhum = rt_thread_create("over_temhum ", overtem_entry, RT_NULL,
                            256,
                            1, 20);
    if (lcd_show != RT_NULL)
         rt_thread_startup(over_temhum  );		
//*******************wifi線程創(chuàng)建***********************************************************//			
		
		wifi= rt_thread_create("wifi ", wifi_entry, RT_NULL,
                            128,
                            2, 20);
    if (wifi != RT_NULL)
         rt_thread_startup(wifi);	
  
     
//*************測試wifi模塊************************************************************************//
}


審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)

    關注

    37

    文章

    6628

    瀏覽量

    123060
  • 軟件框架
    +關注

    關注

    0

    文章

    21

    瀏覽量

    9847
  • RT-Thread
    +關注

    關注

    31

    文章

    1251

    瀏覽量

    39757
收藏 人收藏

    評論

    相關推薦

    基于RT-Thread的RoboMaster電控框架設

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設備驅(qū)動框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇
    發(fā)表于 09-06 15:21 ?619次閱讀

    基于RT-Thread操作系統(tǒng)衍生rt-smart實時操作系統(tǒng)簡介

    1、rt-smart 實時操作系統(tǒng)簡介RT-Thread Smart(簡稱 rt-smart)嵌入式實時操作系統(tǒng)是基于
    發(fā)表于 06-22 17:56

    【原創(chuàng)精選】RT-Thread征文精選技術文章合集

    基于RT-Thread操作系統(tǒng)軟件框架設思路RTthread線程啟動詳解
    發(fā)表于 07-26 14:56

    RT-Thread操作系統(tǒng)有哪些優(yōu)勢?

    軟件包和SDK,擴展系統(tǒng)功能 開發(fā)者說,RT-Thread是最簡潔,優(yōu)雅的開源操作系統(tǒng)之一,簡單易用。 RT-Thread 主要采用 C 語
    發(fā)表于 06-28 08:16

    RT-Thread編程指南

    RT-Thread編程指南——RT-Thread開發(fā)組(2015-03-31)。RT-Thread做為國內(nèi)有較大影響力的開源實時操作系統(tǒng),本文是RT
    發(fā)表于 11-26 16:06 ?0次下載

    RT-Thread用戶手冊

    RT-Thread用戶手冊——本書是RT-Thread的編程手冊,用于指導在RT-Thread實時操作系統(tǒng)環(huán)境下如何進行編 程。
    發(fā)表于 11-26 16:16 ?0次下載

    RT Thread操作系統(tǒng)教程及資料

    ## RT-Thread 簡介 ## RT-Thread RTOS是一款來自中國的開源實時操作系統(tǒng), 由國內(nèi)一些專業(yè)開發(fā)人員開發(fā)、維護。 它不僅僅是一款高效、穩(wěn)定的實時核心,也是一套
    發(fā)表于 05-11 14:54 ?2次下載

    RT-Thread軟件包定義和使用

    RT-Thread軟件包是運行于RT-Thread物聯(lián)網(wǎng)操作系統(tǒng)平臺上,面向不同應用領域的通用軟件組件 。
    的頭像 發(fā)表于 05-21 11:29 ?1w次閱讀
    <b class='flag-5'>RT-Thread</b><b class='flag-5'>軟件</b>包定義和使用

    RT-Thread Smart微內(nèi)核操作系統(tǒng)發(fā)布!

    9月1日,由上海睿賽德電子科技有限公司舉辦的RT-Thread Smart微內(nèi)核操作系統(tǒng)發(fā)布會于北京圓滿落幕,發(fā)布會以見微為主題,邀請到中國工程院院士、產(chǎn)業(yè)專家、高校教授及行業(yè)從業(yè)人員100余位蒞臨
    的頭像 發(fā)表于 09-09 10:49 ?2636次閱讀

    國民技術攜手RT-Thread共同推進MCU與RT-Thread操作系統(tǒng)廣泛適配

    日前,國民技術股份有限公司與知名物聯(lián)網(wǎng)操作系統(tǒng)廠商睿賽德科技(RT-Thread)簽署會員合作協(xié)議,正式成為RT-Thread高級會員。國民技術將基于通用MCU和RT-Thread物聯(lián)
    的頭像 發(fā)表于 12-16 09:56 ?2321次閱讀

    RT-Thread實時操作系統(tǒng)安裝向?qū)?/a>

    、簡易開發(fā)、超低功耗、高安全性的物聯(lián)網(wǎng)操作系統(tǒng)。 RT-Thread 擁有良好的軟件生態(tài),支持市面上所有主流的編譯工具如 GCC、Keil、IAR 等,工具鏈完善、友好,支持各類標準接口。
    發(fā)表于 04-02 09:43 ?7次下載

    RT-Thread操作系統(tǒng)的FreeRTOS兼容層

    的兼容項目中。 1 概述 這是一個針對RT-Thread國產(chǎn)操作系統(tǒng)的FreeRTOS操作系統(tǒng)兼容層,可以讓原有基于FreeRTOS操作系統(tǒng)的項目快速、無感地遷移到
    的頭像 發(fā)表于 01-14 00:55 ?1550次閱讀

    淺析RT-Thread設備驅(qū)動框架

    RT-Thread 設備框架屬于組件和服務層,是基于 RT-Thread 內(nèi)核之上的上層軟件。設備框架是針對某一類外設,抽象出來的一套統(tǒng)一的
    的頭像 發(fā)表于 08-07 15:39 ?1841次閱讀

    基于 RT-Thread 的 RoboMaster 電控框架(一)

    由于 RT-Thread 穩(wěn)定高效的內(nèi)核,豐富的文檔教程,積極活躍的社區(qū)氛圍,以及設備驅(qū)動框架、Kconfig、Scons、日志系統(tǒng)、海量的軟件包……很難不選擇
    的頭像 發(fā)表于 09-19 19:55 ?690次閱讀

    新書發(fā)布——《實時操作系統(tǒng)應用技術:RT-Thread與ARM編程實踐》

    RT-Thread又一本新書《實時操作系統(tǒng)應用技術——基于RT-Thread與ARM的編程實踐》發(fā)布,標志著RT-Thread生態(tài)和實時操作系統(tǒng)
    的頭像 發(fā)表于 05-11 08:35 ?653次閱讀
    新書發(fā)布——《實時<b class='flag-5'>操作系統(tǒng)</b>應用技術:<b class='flag-5'>RT-Thread</b>與ARM編程實踐》