首页 > 编程知识 正文

什么是信号量,java 信号量

时间:2023-05-04 20:00:13 阅读:113417 作者:2889

发板:节点MCu 32 v 1.3

发板引线图:

开发环境: Arduino,https://raw.github user content.com/espressif/arduino-esp 32/GH-pages/package _ esp 32 _ index.JSP 32

实现功能:

)任务1初始化按钮,设置按钮中断,最后删除自身任务;

)2)任务2接收信号量,当在一定时间内接收到信号量时,反转LED灯; 此时间由函数basetype _ txsemaphoretake (semaphore handle _ tx semaphore,TickType_t xTicksToWait )中的第二个参数确定。 其中,xTicksToWait可以用宏pdMS_TO_TICKS ()将毫秒转换为滴答数ticks;

(3)设置:初始化led、串行端口等部分外围设备,创建信号,创建自由远程任务;

Arduino代码如下:

#include Arduino.h/* *开发板: NodeMCU 32 v1.3 * setup () :初始化串行端口、创建自由恢复任务、创建信号*任务任务任务1 :初始化按钮、分配删除ButtonISR :在ISR中释放信号量*任务Task2:等待接收信号量,led */# ifconfig _ free RTOS _ unicore # define arduino _ running _ core 0 反转en nning (else # define arduino _ ru core1)的endif # define long _ time0x ffff # definebuttonpin0//node MCU-32 buttonton //LED的初始状态为低电平//definetwotasksforblinkanalogreadvoidtaskkkey (void * PV参数); voidtaskact (void * PV参数; //信号手柄SemaphoreHandle_t xSemaphore; //thesetupfunctionrunsoncewhenyoupressresetorpowertheboardvoidsetup ((pin mode ) led_builtin,OUTPUT ); 设置//ledserial.begin(115200 ); //串行//nowsetuptwotaskstorunindependently.xtaskcreatepinnedtocore (任务密钥,'任务密钥'//a name just for humans, 2048//thisstacksizecanbecheckedadjustedbyreadingthestackhighwater,NULL,2 //Priority,with3(configmax_priorities-1 xaskcreatepinnedtocore (任务act,'任务act ',2048 //Stack size,NULL,1 //Priority,NULL,arduino _ running _ core whichtakesovercontrolofschedulingindividualtasks, isautomaticallystarted.} void loop---------------/empty.thingsaredoneintasks.--------------------------------------- - serial.println(starttaskkey! ' ); //创建信号xsemaphore=xsemaphorecreatebinary (; 拼音模式(button pin,INPUT ); //中断attach interrupt (数字打印机) buttonpin )、ButtonISR、RISING ); //删除此任务vtaskdelete(null ); //按钮中断函数void ButtonISR () { BaseType_t send; staticbasetype _ txhigherprioritytaskwoken; xhigherprioritytaskwoken=PD false; serial.println('Buttonclicked! ' ); //发射信号量send=xsemaphoregivefromisr (xsemaphore,xHigherPriorityTaskWoken ); if(send==PDtrue ) serial.println (releasesemaphoresuccessfully!' ); else serial.println (fialedtoreleasesemaphore! ' ); //voidtaskact (void * PV参数)//thisisatask.) PV参数; serial.println(starttaskact!' ); BaseType_t rec; BaseType_t msToWait=1000; //信号量接收等待时间TickType_t ticks; for (; (//函数原型: basetype _ txsemaphoretake (semaphore handle _ tx semaphore,TickType_t xTicksToWait ); rec=xsemaphoretake(xsemaphore,PDMS_to_ticks ) mstowait ); //pdMS_TO_TICKS转换为相应的滴答数if(rec==PDtrue ) (serial.println ) receivesemaphoresuccessfully! ' ); state=! 状态; 数字写入(led _ builtin,state ); } else { ticks=PDMS _ to _ ticks (mstowait ); serial.printf (fialedtoreceivesemaphoreafterwaiting % dticks! n ',ticks; }vtaskdelay(15; //onetickdelay(15ms ) in between reads for stability }}结果如下

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。