Free RTOS的信息队列

队列用于在任务之间以及任务与中断之间传递数据,可以在调度程序启动之前或之后创建队列。
配置相关资源
#define configsupport_dynamic_allocation 1  
创建信息队列
queuehandle_t xqueuecreate( ubasetype_t uxqueuelength, ubasetype_t uxitemsize ); 参数:
uxqueuelength:正在创建的队列在任何时候可以容纳的最大项数
uxitemsize:可以存储在队列中的每个数据项的大小(以字节为单位)
返回值:
创建失败返回null,创建成功返回句柄
发送信息
basetype_t xqueuesend( queuehandle_t xqueue, const void * pvitemtoqueue, ticktype_t xtickstowait ); 参数:
xqueue:数据被发送(写入)到的队列的句柄
pvitemtoqueue:一个指向要复制到队列中的数据的指针
xtickstowait:当队列已经满时,任务保持阻塞状态以等待队列上的空间可用的最大时间
返回值:
成功返回pdpass,失败返回errqueue_full
接收信息
basetype_t xqueuereceive( queuehandle_t xqueue, void*pvbuffer, ticktype_txtickstowait ); 参数:
xqueue:从其接收数据(读)的队列的句柄
pvbuffer:一个指向内存的指针,接收到的数据将被复制到其中
xtickstowait:任务保持阻塞状态以等待队列上的数据可用的最大时间,如果队列已经为空
返回值:
成功返回pdpass,失败返回errqueue_full
注意:更多api函数请参阅官方相关文档
简单程序
#include stm32f10x.h#include #include freertos.h#include task.h#include queue.hvoid led_init(void){ gpio_inittypedef gpio_initstructure; //定义结构体变量 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; //定义结构体变量 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结构体变量 usart_inittypedef usart_initstruct; //定义串口结构体变量 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初始化函数 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初始化函数 usart_initstruct.usart_mode=usart_mode_tx|usart_mode_rx; //发送接收模式 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; //无硬件数据流控制 usart_init(usart1,&usart_initstruct); //串口初始化函数 usart_cmd(usart1,enable); //使能usart1}int fputc(int ch,file *f) //printf重定向函数{ usart_senddata(usart1,(uint8_t)ch); //发送一字节数据 while(usart_getflagstatus(usart1,usart_flag_txe) == reset); //等待发送完成 return ch;}#define start_task_prio 1 //任务优先级#define start_stk_size 128 //任务堆栈大小taskhandle_t starttask_handler; //任务句柄void start_task(void *pvparameters);//任务函数#define sen_task_prio 2 //任务优先级#define sen_stk_size 50 //任务堆栈大小taskhandle_t sentask_handler; //任务句柄void sen_task(void *p_arg); //任务函数#define queue_task_prio 3 //任务优先级#define queue_stk_size 50 //任务堆栈大小taskhandle_t queuetask_handler; //任务句柄void queue_task(void *p_arg); //任务函数queuehandle_t xqueue = null;int main( void ) { nvic_prioritygroupconfig(nvic_prioritygroup_4); //设置系统中断优先级分组 4 led_init(); //初始化 led key_init(); usart_init(9600); //创建开始任务 xtaskcreate( (taskfunction_t )start_task, //任务函数 (const char* )start_task, //任务名称 (uint16_t )start_stk_size, //任务堆栈大小 (void* )null, //传递给任务函数的参数 (ubasetype_t )start_task_prio, //任务优先级 (taskhandle_t* )&starttask_handler //任务句柄 ); vtaskstartscheduler(); //开启调度}//开始任务函数void start_task(void *pvparameters){ taskenter_critical(); //进入临界区 //创建一个队列 xqueue = xqueuecreate( 1, sizeof(u8) ); if( xqueue != null ) { printf(创建成功n); } //创建 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 ); //创建 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(); //退出临界区}//sen 任务函数void sen_task(void *pvparameters){ u8 key = 0; while(1) { if( key < 10 ) { key++; } else { key = 0; } if( xqueue != null ) { xqueuesend( ( queuehandle_t ) xqueue, //数据被发送(写入)到的队列的句柄 ( void * ) &key, //一个指向要复制到队列中的数据的指针 ( ticktype_t ) portmax_delay ); //当队列已经满时,任务保持阻塞状态以等待队列上的空间可用的最大时间 } vtaskdelay(1000); }}//queue 任务函数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); }}  
实验效果
--end--

采用AT89C51微处理器和olaroid 600系列传感器实现超声波测距系统设计
医疗物联网创新的设计基础
区块链技术为公益慈善领域带来了透明度和可追溯性
rk3566处理器属于什么档次?
32.768KHZ晶振的主要特点
Free RTOS的信息队列
美国防部授予格芯价值31亿美元、为期10年的新安全芯片制造合同
PTC热敏电阻在限制励磁涌流中的应用
CMW65R041DFD:电子工程师眼中的650V SJ MOSFET
GPIO 与 40-pin
Computex揭幕 群联Gen4 SSD芯片效能刷新世界纪录
物联网技术可以在哪些领域中使用
石墨烯电池获重大技术突破 年底将推快充手机!为何总是华为?
大疆也需要“走向神坛”,去做那些他们以前不会做的事情
抛弃高通?苹果自己设计5G版iPhone天线
ams OSRAM推出可用于一次性医用内窥镜的NanEyeM摄像头模组
linux kernel工作队列及源码详细讲解
智能语音技术在安防行业的应用前景分析
32SEGx4COM LCD液晶驱动IC VK0128B
采用MXT8051单片机实现基站温控仪的设计