当前位置: 首页 > news >正文

免费网站安全软件大全免费下载安装网站SEO容易做吗

免费网站安全软件大全免费下载安装,网站SEO容易做吗,什么 门户网站,上海缔客网站建设公司目录 事件组 创建事件组 删除事件组 设置事件 等待事件 同步点 应用场景#xff1a;等待多个事件 应用场景#xff1a;任务同步 事件组 事件组可看成一个整形数#xff0c;每一位代表一个事件。 每一位事件的含义由程序员决定#xff0c;如位0表示串口是否就绪等待多个事件 应用场景任务同步 事件组 事件组可看成一个整形数每一位代表一个事件。 每一位事件的含义由程序员决定如位0表示串口是否就绪位1表示按键是否被按下。 每一位的值1表示事件发生0表示事件还没发生。 一个或多个任务、ISR都可以去读、写位。 可以等待某一位或等待某些位的任意一个或等待多位。 事件组用一个整数表示其中高8位留给内核使用其他位可表示为事件。 如果configUSE_16_BIT_TICKS是1就表示该处理器使用16位更高效则整数是16位低8位表示事件。 如果configUSE_16_BIT_TICKS是0就表示该处理器使用32位更高效则整数是32位低24位表示事件。 创建事件组 /* 创建一个事件组返回它的句柄。此函数内部会分配事件组结构体。* 返回值: 返回句柄非NULL表示成功 */ EventGroupHandle_t xEventGroupCreate( void );/* 创建一个事件组返回它的句柄。* 此函数无需动态分配内存所以需要先有一个StaticEventGroup_t结构体并传入它的指针* 返回值: 返回句柄非NULL表示成功 */ EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ); 删除事件组 对于动态创建的事件组不再需要它们时可以删除它们以回收内存。 /* xEventGroup: 事件组句柄你要删除哪个事件组 */ void vEventGroupDelete( EventGroupHandle_t xEventGroup ); 设置事件 /* 设置事件组中的位* xEventGroup: 哪个事件组* uxBitsToSet: 设置哪些位?* 返回值: 返回原来的事件值(没什么意义, 因为很可能已经被其他任务修改了) */ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );/* 设置事件组中的位* xEventGroup: 哪个事件组* uxBitsToSet: 设置哪些位?* pxHigherPriorityTaskWoken: 有没有导致更高优先级的任务进入就绪态? pdTRUE-有, pdFALSE-没有* 返回值: pdPASS-成功, pdFALSE-失败 */ BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t * pxHigherPriorityTaskWoken ); 注意 ISR的函数如队列函数xQueueSendToBackFromISR、信号量函数xSemaphoreGiveFromISR它们会唤醒某个任务最多只会唤醒一个任务。 但设置事件组时可能导致多个任务被唤醒会带来很大的不确定性。所以xEventGroupSetBitsFromISR函数不是直接去设置事件组而是给一个FreeRTOS后台任务daemon task发送队列数据由这个任务来设置事件组。 如果后台任务的优先级比当前被中断的任务优先级高xEventGroupSetBitsFromISR会设置*ppxHigherPriorityTaskWoken为pdTRUE。 如果后台任务成功把队列数据发送给了后台任务xEventGroupSetBitsFromISR的返回值就是pdPASS。 等待事件 EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, // 等待某个事件组const EventBits_t uxBitsToWaitFor, // 等待某些位const BaseType_t xClearOnExit, // pdTRUE等待的位全部为1pdFALSE等待的位某个为1即可const BaseType_t xWaitForAllBits, // pdTRUE清除uxBitsToWaitFor指定的位pdFALSE不清除TickType_t xTicksToWait ); // 阻塞时间。0表示立即返回portMAX_DELAY表示直到成功才返回。也可使用pdMS_TO_TICKS(ms) // 返回值返回事件值 // 如果期待的事件发生了返回的是非阻塞条件成立的事件组 // 如果超时退出返回的是超时时刻的事件值 可以使用xEventGroupWaitBits()等待期待的时间发生之后再使用xEventGroupClearBits()来清除。但是这两个函数间有可能被其他任务或中断抢占它们有可能会修改事件组。 可以使用设置xclearOnExit为pdTRUE使得对事件组的测试、清零都在xEventGroupWaitBits()函数内部完成这是一个原子操作。 同步点 EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, // 指定事件组const EventBits_t uxBitsToSet, // 设置事件位const EventBits_t uxBitsToWaitFor, // 等待事件位TickType_t xTicksToWait ); // 阻塞时间。0表示立即返回portMAX_DELAY表示直到成功才返回。可使用pdMS_TO_TICKS(ms) // 返回值 // 如果期待的事件发生了返回的是非阻塞条件成立时的事件值 // 如果超时退出返回的是超时时刻的事件值 成功返回后会清除事件。 应用场景等待多个事件 int main( void ) {prvSetupHardware();/* 创建递归锁 */xEventGroup xEventGroupCreate( );if( xEventGroup ! NULL ){/* 创建3个任务: 洗菜/生火/炒菜 */xTaskCreate( vWashingTask, Task1, 1000, NULL, 1, NULL );xTaskCreate( vFiringTask, Task2, 1000, NULL, 2, NULL );xTaskCreate( vCookingTask, Task3, 1000, NULL, 3, NULL );/* 启动调度器 */vTaskStartScheduler();} else{/* 无法创建事件组 */} /* 如果程序运行到了这里就表示出错了, 一般是内存不足 */return 0; }static void vWashingTask( void *pvParameters ) {int i 0;/* 无限循环 */for(;;){printf(I am washing %d time...\r\n, i);/* 发出事件我洗完菜了 */xEventGroupSetBits(xEventGroup, WASHING);/* 等待大厨炒完菜再继续洗菜 */xEventGroupWaitBits(xEventGroup, COOKING, pdTRUE, pdTRUE, portMAX_DELAY);} }static void vFiringTask( void *pvParameters ) {int i 0;/* 无限循环 */for(;;){/* 等待洗完菜才生火 */xEventGroupWaitBits(xEventGroup, WASHING, pdTRUE, pdTRUE, portMAX_DELAY);printf(I am firing %d time...\r\n, i);/* 发出事件我生好火了 */xEventGroupSetBits(xEventGroup, FIRING); } }static void vCookingTask( void *pvParameters ) {int i 0;/* 无限循环 */for(;;){/* 等待两件事洗完菜生完火 */xEventGroupWaitBits(xEventGroup, WASHING | FIRING, pdTRUE, pdTRUE, portMAX_DELAY);printf(I am cooking %d time...\r\n, i);/* 发出事件我炒完菜了 */xEventGroupSetBits(xEventGroup, WASHING);} } 实验现象 I am washing 0 time... I am firing 0 time... I am cooking 0 time... I am washing 1 time... I am firing 1 time... I am cooking 1 time... ... 应用场景任务同步 int main( void ) {prvSetupHardware();/* 创建递归锁 */xEventGroup xEventGroupCreate( );if( xEventGroup ! NULL ){/* 创建3个任务: 洗菜/买酒/摆台 */xTaskCreate( vCookingTask, task1, 1000, A, 1, NULL );xTaskCreate( vBuyingTask, task2, 1000, B, 2, NULL );xTaskCreate( vTableTask, task3, 1000, C, 3, NULL );/* 启动调度器 */vTaskStartScheduler();} else{/* 无法创建事件组 */} /* 如果程序运行到了这里就表示出错了, 一般是内存不足 */return 0; }static void vCookingTask( void *pvParameters ) {const TickType_t xTicksToWait pdMS_TO_TICKS( 100UL );int i 0;/* 无限循环 */for( ;; ){/* 做自己的事 */printf(%s is cooking %d time....\r\n, (char *)pvParameters, i);/* 表示我做好了, 还要等别人都做好 */xEventGroupSync(xEventGroup, COOKING, ALL, portMAX_DELAY);/* 别人也做好了, 开饭 */printf(%s is eating %d time....\r\n, (char *)pvParameters, i);vTaskDelay(xTicksToWait);} }static void vBuyingTask( void *pvParameters ) {const TickType_t xTicksToWait pdMS_TO_TICKS( 100UL );int i 0;/* 无限循环 */for( ;; ){/* 做自己的事 */printf(%s is buying %d time....\r\n, (char *)pvParameters, i);/* 表示我做好了, 还要等别人都做好 */xEventGroupSync(xEventGroup, BUYING, ALL, portMAX_DELAY);/* 别人也做好了, 开饭 */printf(%s is eating %d time....\r\n, (char *)pvParameters, i);vTaskDelay(xTicksToWait);} }static void vTableTask( void *pvParameters ) {const TickType_t xTicksToWait pdMS_TO_TICKS( 100UL );int i 0;/* 无限循环 */for( ;; ){/* 做自己的事 */printf(%s is do the table %d time....\r\n, (char *)pvParameters, i);/* 表示我做好了, 还要等别人都做好 */xEventGroupSync(xEventGroup, TABLING, ALL, portMAX_DELAY);/* 别人也做好了, 开饭 */printf(%s is eating %d time....\r\n, (char *)pvParameters, i);vTaskDelay(xTicksToWait);} } 实验现象 C is do the table 0 time.... B is buying 0 time.... A is cooking 0 time.... C is eating 0 time.... B is eating 0 time.... A is eating 0 time.... C is do the table 1 time.... B is buying 1 time.... A is cooking 1 time.... C is eating 1 time.... B is eating 1 time.... A is eating 1 time.... ...
http://www.zqtcl.cn/news/912564/

相关文章:

  • 完全不收费的聊天软件班级优化大师下载安装app
  • 合肥网站改版360免费建站永久免费
  • 商业网站建设案例课程 下载工信部企业网站认证
  • 泉州网站设计哪家公司好沈阳seo代理计费
  • 做景观素材有哪几个网站国内建网站费用
  • 驻马店重点项目建设网站wordpress常规选项
  • 网站开发 英文网站策划建设阶段的推广
  • 建立网站一般多少钱wordpress评论跳过验证
  • 南京每月做社保明细在哪个网站查看设计作品的网站软件
  • html怎么做网站如何在腾讯云上网站建设
  • 网站建设怎么链接表格手机做外贸有什么好的网站
  • 深圳开发网站建设哪家好外贸网络营销培训
  • 广州智迅网络做网站免费下载ps素材网站
  • 什么网站时候做伪静态开发软件定制
  • 找人做网站 多少钱西宁市公司网站建设
  • 网页设计 教程网站找权重高的网站方法
  • 网站建设本地还是外地重庆seo排名方法
  • 那个网站做网编好昨晚兰州发生了什么事
  • 温州建设局网站首页哪里可以学做资料员的网站
  • 网站怎样在360做优化wordpress文章图片在线裁剪
  • 彭州建设网站建设网站哪间公司比较好
  • qq空间网站根目录慧聪网首页
  • 制作小程序和网站的公司杭州品牌设计公司
  • 显示网站翻页代码wordpress 金融 模板下载
  • 用双语网站做seo会不会phpmysql网站
  • 长沙专业网站建设公司优惠券怎么做自己的网站
  • 做网站如何宣传怎么弄公众号
  • seo网站策划书网站建设资金投入
  • 做网站东莞东莞建网站wordpress 多文件上传
  • 公司注册流程聊城网站优化案例