FreeRTOS 訊息佇列 訊息佇列傳遞變數

2021-10-21 12:14:04 字數 2256 閱讀 6266

訊息佇列建立及執行,參閱安富萊電子demo

static queuehandle_t xqueue1 =

null

;static queuehandle_t xqueue2 =

null

;typedef

struct msg

msg_t;

msg_t g_tmsg;

/* 定義乙個結構體用於訊息佇列 */

static

void

vtasktaskuserif

(void

*pvparameters)

else

break

;/* k3鍵按下,向xqueue2傳送資料 */

case key_down_k3:

ptmsg->ucmessageid++

; ptmsg->uldata[0]

++;; ptmsg->usdata[0]

++;/* 使用訊息佇列實現指標變數的傳遞 */if(

xqueuesend

(xqueue2,

/* 訊息佇列控制代碼 */

(void*)

&ptmsg,

/* 傳送結構體指標變數ptmsg的位址 */

(ticktype_t)10)

!= pdpass )

else

/* 其他的鍵值不處理 */

default

:break;}

}vtaskdelay(20

);}}

static

void

vtaskled

(void

*pvparameters)

else}}

static

void

vtaskmsgpro

(void

*pvparameters)

else}}

intmain

(void

)/* 建立10個儲存指標變數的訊息佇列,由於cm3/cm4核心是32位機,乙個指標變數占用4個位元組 */

xqueue2 =

xqueuecreate(10

,sizeof

(struct msg *))

;if( xqueue2 ==0)

/* 啟動排程,開始執行任務 */

vtaskstartscheduler()

;/*

如果系統正常啟動是不會執行到這裡的,執行到這裡極有可能是用於定時器任務或者空閒任務的

heap空間不足造成建立失敗,此要加大freertosconfig.**件中定義的heap大小:

#define configtotal_heap_size ( ( size_t ) ( 17 * 1024 ) )

*/while(1

);}/* 如果程式使用到了硬體中斷請使用以下方式 */

static

void

tim1_irqhandler

(void

)static

void

tim2_irqhandler

(void

)

stm32cubemx 佇列建立及執行

以下是普通變數佇列建立和執行

注意: stm32cubemx 生成的**訊息佇列目前只能傳遞普通變數,如果傳遞結構體或者其它型別變數,最好不使用 cmsis_os.h封裝好的api

/* user code begin 4 */

void

messageqtask

(void

const

* argument)

else

osdelay

(1000);

}/* user code end 5 */

}void

startdefaulttask

(void

const

* argument)

osdelay(10

);osthreadsuspend

(defaulttaskhandle)

;//掛起任務

}/* user code end 5 */

}int

main

(void

)

3 2 2 佇列訊息和非佇列訊息

摘錄於 windows程式 第5版,珍藏版 charles.petzold 著 p60 前面提過 windows 將訊息傳送給乙個視窗,意思是說 windows 呼叫了該視窗的視窗過程。但是,乙個 windows 程式同時還具有乙個訊息迴圈使用者從訊息佇列中檢索和分發訊息,其中檢索訊息是通過呼叫 g...

訊息佇列 訊息佇列

輪詢排程 一次性分發所有訊息,保證訊息平均分配,不管消費者是否能正常消費 訊息應答 保證消費端能確實消費,不丟失 公平 乙個乙個分發所有訊息,在保證分發到的執行緒確認回覆後,才分發下個訊息給下個空閒的消費者,訊息持久化 保證佇列中的訊息不丟失,包括3要素 交換器 訊息佇列 訊息都必須宣告持久化 發布...

訊息佇列 訊息佇列 kafka

kafka是乙個分布式的基於發布 訂閱模式的訊息佇列,主要用於大資料實時處理領域。要理解kafka首先要有分布式的概念,要有訊息佇列的概念。分布式系統最大的優勢就是解耦和削峰,這種情況下,a系統生成了乙個訊息,b系統非同步獲取,那麼就需要乙個存放訊息的訊息佇列 mq 相比較傳統的訊息佇列,訊息被消費...