色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

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

Free RTOS的信息隊列

汽車電子技術(shù) ? 來源:玩轉(zhuǎn)單片機 ? 作者: Julian ? 2023-02-10 16:01 ? 次閱讀

隊列用于在任務之間以及任務與中斷之間傳遞數(shù)據(jù),可以在調(diào)度程序啟動之前或之后創(chuàng)建隊列。

配置相關(guān)資源

#define configSUPPORT_DYNAMIC_ALLOCATION 1

創(chuàng)建信息隊列

QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, 
                              UBaseType_t uxItemSize );

參數(shù)

uxQueueLength:正在創(chuàng)建的隊列在任何時候可以容納的最大項數(shù)

uxItemSize:可以存儲在隊列中的每個數(shù)據(jù)項的大小(以字節(jié)為單位)

返回值

創(chuàng)建失敗返回NULL,創(chuàng)建成功返回句柄

發(fā)送信息

BaseType_t xQueueSend( QueueHandle_t xQueue, 
                       const void * pvItemToQueue, 
                       TickType_t xTicksToWait );

參數(shù)

xQueue:數(shù)據(jù)被發(fā)送(寫入)到的隊列的句柄

pvItemToQueue:一個指向要復制到隊列中的數(shù)據(jù)的指針

xTicksToWait:當隊列已經(jīng)滿時,任務保持阻塞狀態(tài)以等待隊列上的空間可用的最大時間

返回值

成功返回pdPASS,失敗返回errQUEUE_FULL

接收信息

BaseType_t xQueueReceive( QueueHandle_t xQueue, 
                          void*pvBuffer, 
                          TickType_txTicksToWait );

參數(shù)

xQueue:從其接收數(shù)據(jù)(讀)的隊列的句柄

pvBuffer:一個指向內(nèi)存的指針,接收到的數(shù)據(jù)將被復制到其中

xTicksToWait:任務保持阻塞狀態(tài)以等待隊列上的數(shù)據(jù)可用的最大時間,如果隊列已經(jīng)為空

返回值

成功返回pdPASS,失敗返回errQUEUE_FULL

注意:更多API函數(shù)請參閱官方相關(guān)文檔

簡單程序

#include "stm32f10x.h"
#include 
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;              //定義結(jié)構(gòu)體變量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);  //開啟時鐘
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;    //選擇你要設置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      //設置推挽輸出模式
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設置傳輸速率
  GPIO_Init(GPIOC,&GPIO_InitStructure);                //初始化GPIO
  
  GPIO_SetBits(GPIOC,GPIO_Pin_0|GPIO_Pin_1);            //將LED端口拉高,熄滅LED
}

void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure; //定義結(jié)構(gòu)體變量  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;     //選擇你要設置的IO口
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;//下拉輸入  
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;     //設置傳輸速率
  GPIO_Init(GPIOA,&GPIO_InitStructure);      /* 初始化GPIO */
  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_2|GPIO_Pin_4;
  GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉輸入
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOE,&GPIO_InitStructure);
}


void USART_init(uint32_t bound)
{
  GPIO_InitTypeDef GPIO_InitStruct;   //定義GPIO結(jié)構(gòu)體變量
  USART_InitTypeDef USART_InitStruct;   //定義串口結(jié)構(gòu)體變量
  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);   //使能GPIOC的時鐘
  
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;   //配置TX引腳
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;   //配置PA9為復用推挽輸出
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //配置PA9速率
  GPIO_Init(GPIOA,&GPIO_InitStruct);   //GPIO初始化函數(shù)
  
  GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;   //配置RX引腳
  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;   //配置PA10為浮空輸入
  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;   //配置PA10速率
  GPIO_Init(GPIOA,&GPIO_InitStruct);   //GPIO初始化函數(shù)
  
  
  USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;   //發(fā)送接收模式
  USART_InitStruct.USART_Parity=USART_Parity_No;   //無奇偶校驗
  USART_InitStruct.USART_BaudRate=bound;   //波特率
  USART_InitStruct.USART_StopBits=USART_StopBits_1;   //停止位1位
  USART_InitStruct.USART_WordLength=USART_WordLength_8b;   //字長8位
  USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //無硬件數(shù)據(jù)流控制
  USART_Init(USART1,&USART_InitStruct);   //串口初始化函數(shù)
  
  USART_Cmd(USART1,ENABLE);   //使能USART1
}

int fputc(int ch,FILE *f)   //printf重定向函數(shù)
{
  USART_SendData(USART1,(uint8_t)ch);   //發(fā)送一字節(jié)數(shù)據(jù)
  while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);   //等待發(fā)送完成
  return ch;
}


#define START_TASK_PRIO 1      //任務優(yōu)先級
#define START_STK_SIZE 128      //任務堆棧大小
TaskHandle_t StartTask_Handler;   //任務句柄
void Start_Task(void *pvParameters);//任務函數(shù)

#define Sen_TASK_PRIO 2       //任務優(yōu)先級
#define Sen_STK_SIZE 50       //任務堆棧大小
TaskHandle_t SenTask_Handler;     //任務句柄
void Sen_Task(void *p_arg);     //任務函數(shù)

#define Queue_TASK_PRIO 3       //任務優(yōu)先級
#define Queue_STK_SIZE 50       //任務堆棧大小
TaskHandle_t QueueTask_Handler;   //任務句柄
void Queue_Task(void *p_arg);     //任務函數(shù)

QueueHandle_t xQueue = NULL;

int main( void ) 
{
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);    //設置系統(tǒng)中斷優(yōu)先級分組 4
  LED_Init(); //初始化 LED
  KEY_Init();
  USART_init(9600);
  //創(chuàng)建開始任務
  xTaskCreate(
    (TaskFunction_t )Start_Task,     //任務函數(shù)
    (const char* )"Start_Task",     //任務名稱
    (uint16_t )START_STK_SIZE,       //任務堆棧大小
    (void* )NULL,             //傳遞給任務函數(shù)的參數(shù)
    (UBaseType_t )START_TASK_PRIO,     //任務優(yōu)先級
    (TaskHandle_t* )&StartTask_Handler  //任務句柄 
  );
  vTaskStartScheduler();  //開啟調(diào)度
}
//開始任務函數(shù)
void Start_Task(void *pvParameters)
{
  taskENTER_CRITICAL();   //進入臨界區(qū)
  //創(chuàng)建一個隊列
  xQueue = xQueueCreate( 1, sizeof(u8)  );
  if( xQueue != NULL )
  {
    printf("創(chuàng)建成功n");
  }
  //創(chuàng)建 Sen 任務
  xTaskCreate(
    (TaskFunction_t )Sen_Task, 
    (const char* )"Sen_Task", 
    (uint16_t )Sen_STK_SIZE, 
    (void* )NULL,
    (UBaseType_t )Sen_TASK_PRIO,
    (TaskHandle_t* )&SenTask_Handler
  );
  //創(chuàng)建 Queue 任務
  xTaskCreate(
    (TaskFunction_t )Queue_Task, 
    (const char* )"Queue_Task", 
    (uint16_t )Queue_STK_SIZE, 
    (void* )NULL,
    (UBaseType_t )Queue_TASK_PRIO,
    (TaskHandle_t* )&QueueTask_Handler
  );
  vTaskDelete(StartTask_Handler); //刪除開始任務
  taskEXIT_CRITICAL();   //退出臨界區(qū)
}

//Sen 任務函數(shù)
void Sen_Task(void *pvParameters)
{
  u8 Key = 0;
  while(1)
  {
    if( Key < 10 )
    {
      Key++;
    }
    else
    {
      Key = 0;
    }
    if( xQueue != NULL )
    {
      xQueueSend( ( QueueHandle_t ) xQueue,         //數(shù)據(jù)被發(fā)送(寫入)到的隊列的句柄
            ( void *        ) &Key,          //一個指向要復制到隊列中的數(shù)據(jù)的指針
            ( TickType_t    ) portMAX_DELAY   );  //當隊列已經(jīng)滿時,任務保持阻塞狀態(tài)以等待隊列上的空間可用的最大時間
    }
    vTaskDelay(1000);
  }
}

//Queue 任務函數(shù)
void Queue_Task(void *pvParameters)
{
  u8 Key_Receive = 0;
  while(1)
  {
    xQueueReceive( ( QueueHandle_t ) xQueue, 
             ( void *        ) &Key_Receive, 
             ( TickType_t    ) portMAX_DELAY );
    printf("%dn",Key_Receive);
    vTaskDelay(500);
  }
}

實驗效果

poYBAGPl-cyAAdDAAABZZm7mpPM637.png

--END--


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

    關(guān)注

    117

    文章

    3792

    瀏覽量

    81165
  • 隊列
    +關(guān)注

    關(guān)注

    1

    文章

    46

    瀏覽量

    10921
  • 傳遞數(shù)據(jù)
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    6229
收藏 人收藏

    評論

    相關(guān)推薦

    RTOS信號量、隊列通信原理

    有深入理解RTOS原理,或閱讀過RTOS源碼的同學應該知道:RTOS實現(xiàn)任務間通信通常是由一系列指針進行操作實現(xiàn)的。
    發(fā)表于 08-16 10:07 ?1690次閱讀

    【CW32移植Free-RTOS】CW32開發(fā)者扶持計劃

    CW32配置Free-RTOS全過程,CW32開發(fā)者扶持計劃
    的頭像 發(fā)表于 04-18 09:38 ?6186次閱讀
    【CW32移植<b class='flag-5'>Free-RTOS</b>】CW32開發(fā)者扶持計劃

    【RA-Eco-RA2E1-48PIN-V1.0開發(fā)板試用】嘗試嵌入式操作系統(tǒng)Free-RTOS

    本篇分享我們嘗試嵌入式操作系統(tǒng)Free-RTOS 首先新建一個Free-RTOS項目。 現(xiàn)在使用IDE建立嵌入式操作系統(tǒng)可太簡單了,遙想當年,還要自己動手移植,那叫一個難。。。 設置P103
    發(fā)表于 11-14 23:08

    【MiCOKit試用體驗】慶科MiCO系統(tǒng)篇(4)MiCO RTOS消息隊列

    本帖最后由 gjianw217 于 2015-10-25 15:50 編輯 在本帖子中,主要分析一下慶科MiCO RTOS的消息隊列,具體包括:OS消息隊列MiCO消息隊列關(guān)鍵A
    發(fā)表于 10-24 17:03

    STM32 + F103VE + Free RTOS 操作系統(tǒng)移植

    STM32 + F103VE + Free RTOS 操作系統(tǒng)移植
    發(fā)表于 03-04 20:03

    在energia 編譯器中使用free_rtos或者ti_rtos

    請問在energia編譯器里,有使用free_rtos或者ti_rtos的案例程序嗎?
    發(fā)表于 05-14 11:11

    CC3200 可以使用 ccs TI-RTOS 和 iar FREE-RTOS,為什么要有兩個OS,他們有什么區(qū)別?

    本帖最后由 一只耳朵怪 于 2018-6-7 15:32 編輯 請教一下TI的工程師, CC3200 可以使用ccs TI-RTOS 和 iar FREE-RTOS。1、為什么要有兩個OS
    發(fā)表于 06-07 02:34

    FREE-RTOS中怎樣使用simplelink api函數(shù)

    您好: ??? 我現(xiàn)在正在學習cc3200?? FREE_RTOS系統(tǒng)demo。請問我想在啟動線程函數(shù)之前使用??? “文件操作系統(tǒng)的API函數(shù)”? ,讀取flash的一些參數(shù),請問我應該怎么操作?
    發(fā)表于 06-21 08:04

    RTT有類似UCOS,或者FREE RTOS這類的移植方法嗎?

    的操作把難度為3的操作,降低為難度1. 網(wǎng)上一堆工具使用教程,也都是基于自身已經(jīng)了解很多基礎知識上再寫的. RTT難道就沒有類似UCOS,或者FREE RTOS這類的移植方法?
    發(fā)表于 01-21 06:20

    Free RTOS移植問題的解決辦法?

    按照原子哥的free rtos抑制說明文檔做第一個工程,改完代碼編譯出現(xiàn)xPortSysTickHandler()函數(shù)未定義,頭文件中加入task.h和FreeRTOS.h。實在找不出問題所在,,,there must be anther problem???
    發(fā)表于 06-11 07:57

    Small RTOS 的設計思想及消息隊列通信機制的應用

    將Small RTOS 多任務的思想應用在一個具體的單片機控制的電子式存包柜系統(tǒng)的軟件設計中,介紹了基于消息隊列的任務通訊的編程方法。
    發(fā)表于 04-23 06:22

    了解一下RTOS消息隊列的應用

    基于RTOS的應用中,通常使用隊列機制實現(xiàn)任務間的數(shù)據(jù)交互,一個應用程序可以有任意數(shù)量的消息隊列,每個消息隊列都有自己的用途。 什么是消息隊列
    發(fā)表于 06-12 14:17

    實時操作系統(tǒng)Free RTOS的詳細介紹

    實時操作系統(tǒng)Free RTOS 簡介 FreeRTOS是一個迷你的實時操作系統(tǒng)內(nèi)核。作為一個輕量級的操作系統(tǒng),功能包括:任務管理、時間管理、信號量、消息隊列、內(nèi)存管理、記錄功能、軟件定時器、協(xié)程等
    發(fā)表于 06-21 14:30 ?6305次閱讀

    RTOS消息隊列的多種用途

      消息隊列可以以多種不同的方式使用。事實上,您可以編寫可能只使用消息隊列的相當復雜的應用程序。僅使用消息隊列可以減少代碼的大?。凑加每臻g),因為可以模擬許多其他服務(信號量、時間延遲和事件標志)。
    的頭像 發(fā)表于 06-29 14:57 ?2570次閱讀
    <b class='flag-5'>RTOS</b>消息<b class='flag-5'>隊列</b>的多種用途

    RTOS消息隊列的應用

    基于RTOS的應用中,通常使用隊列機制實現(xiàn)任務間的數(shù)據(jù)交互,一個應用程序可以有任意數(shù)量的消息隊列,每個消息隊列都有自己的用途。
    發(fā)表于 05-29 10:49 ?642次閱讀
    <b class='flag-5'>RTOS</b>消息<b class='flag-5'>隊列</b>的應用
    主站蜘蛛池模板: 一个人免费视频在线观看| 美女丝袜夹b| 真实农村女人野外自拍照片| 欧美猛男gaygayxxgv| 国内久久久久影院精品| yin乱教师系列合集| 又黄又肉到湿的爽文| 王晶三级作品| 欧美精品AV一区二区无码| 精品免费久久久久久成人影院| 城中村快餐嫖老妇对白| 中文亚洲大香伊蕉不卡一区| 亚州综合网| 日韩中文网| 男女无遮挡吃奶gift动态图| 黄色大片aa| 国产欧美日韩网站| 俄罗斯bbbbbbbbb大片| 99久久精品6在线播放| 亚洲视频中文字幕在线观看| 甜性涩爱免费下载| 日本19禁啪啪吃奶大尺度| 开心成人社区| 精品一区二区三区免费毛片 | 国产成人精品电影在线观看| 99久酒店在线精品2019| 影音先锋男人资源813.| 亚洲精品国产第一区第二区| 色婷婷欧美在线播放内射| 欧美伦理片第7页| 嗯啊…跟校草在教室里做h| 久久午夜免费视频| 久久xxxx| 久久精品天天爽夜夜爽| 绞尽奶汁by菊花开| 回复术士勇者免费观看全集| 国产亚洲精品久久精品录音| 国产午夜电影在线观看不卡| 国产久久亚洲美女久久| 国产精品久久久久影院| 国产精品成人无码久免费|