Free RTOS的任务通知-1

每个任务都有一个32位的通知值,该值在创建任务时初始化为零。
配置相关资源
//为1时开启任务通知#define configuse_task_notifications 1  
发送
basetype_t xtasknotifygive( taskhandle_t xtasktonotify ); 参数:
xtasktonotify:被通知并使其通知值递增的任务句柄
接收
uint32_t ultasknotifytake( basetype_t xclearcountonexit, ticktype_t xtickstowait ); 参数:
xclearcountonexit:是否需要清零
xtickstowait:等待时间
实验程序
#include stm32f10x.h#include #include freertos.h#include task.hvoid 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 send_task_prio 2 //任务优先级#define send_stk_size 50 //任务堆栈大小taskhandle_t sendtask_handler; //任务句柄void send_task(void *p_arg); //任务函数#define read_1_task_prio 3 //任务优先级#define read_1_stk_size 50 //任务堆栈大小taskhandle_t readtask_1_handler; //任务句柄void read_1_task(void *p_arg); //任务函数#define read_2_task_prio 3 //任务优先级#define read_2_stk_size 50 //任务堆栈大小taskhandle_t readtask_2_handler; //任务句柄void read_2_task(void *p_arg); //任务函数int main( void ) { nvic_prioritygroupconfig(nvic_prioritygroup_4);//设置系统中断优先级分组 4 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(); //进入临界区 //创建 send_task 任务 xtaskcreate( (taskfunction_t )send_task, (const char* )send_task, (uint16_t )send_stk_size, (void* )null, (ubasetype_t )send_task_prio, (taskhandle_t* )&sendtask_handler ); //创建 read_1_task 任务 xtaskcreate( (taskfunction_t )read_1_task, (const char* )read_1_task, (uint16_t )read_1_stk_size, (void* )null, (ubasetype_t )read_1_task_prio, (taskhandle_t* )&readtask_1_handler ); //创建 read_2_task 任务 xtaskcreate( (taskfunction_t )read_2_task, (const char* )read_2_task, (uint16_t )read_2_stk_size, (void* )null, (ubasetype_t )read_2_task_prio, (taskhandle_t* )&readtask_2_handler ); vtaskdelete(starttask_handler); //删除开始任务 taskexit_critical(); //退出临界区}//send_task 任务函数void send_task(void *pvparameters){ while(1) { if(gpio_readinputdatabit( gpioe, gpio_pin_2)==0) { xtasknotifygive( readtask_1_handler ); } if(gpio_readinputdatabit( gpioe, gpio_pin_3)==0) { xtasknotifygive( readtask_2_handler ); } printf(正在发送n); vtaskdelay(1000); }}//read_1_task 任务函数void read_1_task(void *pvparameters){ uint32_t xreturn = 0; while(1) { xreturn = ultasknotifytake( pdtrue, //是否清零 portmax_delay );//等待时间 printf(task1 = %dn,xreturn); printf(正在获取n); vtaskdelay(1000); }}//read_2_task 任务函数void read_2_task(void *pvparameters){ uint32_t xreturn = 0; while(1) { xreturn = ultasknotifytake( pdtrue, //是否清零 portmax_delay );//等待时间 printf(task2 = %dn,xreturn); printf(正在获取n); vtaskdelay(1000); }}  
实验现象
--end--

网约车出行行业的壁垒,美团打车难打破出行行业壁垒
简析C# Socket程序结构及应用
Pericom推出多类高速连接、时频和控制新品
英伟达新一代GPU架构安培A100发布,实现高达20倍的性能提升
中国移动改变单一流量计费模式,实现5G价值
Free RTOS的任务通知-1
区块链分布式P2P网络有哪些特点
Alpakka控制器:DIY指南
一文看懂路由器传输速率300m与450m区别
8位或32位,MCU究竟该怎么选
路透社:美国核准汽车芯片出货华为许可证
工业4.0:打造面向未来的工业以太网 加速边缘到云端
半导体材料是什么?
莱迪思推出更优成本、可灵活配置的高性能EtherCAT伺服驱动方案
河套IT WALK:云计算助力金融和可持续发展,人工智能推动制造业转型,自动驾驶迎来重大升级
通孔和盲孔对信号的差异影响有多大?应用的原则是什么?
都是64GB,小米max2和努比亚z17mini你会选谁?
电容可以抗干扰吗 电容和变压器的区别 如何防止电容充爆
亚马逊用机器人手臂来分拣投递物品已获专利
浙江爱康科技异质结高效太阳能电池项目开工仪式正式举行