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

什么网站可以做护士三基试题百度趋势搜索

什么网站可以做护士三基试题,百度趋势搜索,wordpress给用户自动注册,seo职位招聘文章目录 基础知识创建信号量获取信号量释放信号量信号量 内部实现框图 基础知识 [FreeRTOS 基础知识] 信号量 概念 创建信号量 #define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U ) #define semSEMAPHORE_QUEUE_ITEM_LENGTH ( ( uint8_t ) 0U ) #define xSe…

文章目录

    • 基础知识
    • 创建信号量
    • 获取信号量
    • 释放信号量
    • 信号量 内部实现框图


基础知识

[FreeRTOS 基础知识] 信号量 概念


创建信号量

#define queueQUEUE_TYPE_BINARY_SEMAPHORE    ( ( uint8_t ) 3U )
#define semSEMAPHORE_QUEUE_ITEM_LENGTH    ( ( uint8_t ) 0U )
#define xSemaphoreCreateBinary() xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )

根据上面的定义,可知创建信号量本质就是创建队列。长度(第一个参数)为1,大小(第二个参数)为0

QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType )->     if( uxItemSize == ( UBaseType_t ) 0 ) xQueueSizeInBytes = ( size_t ) 0;->     pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );  // 动态分配大小,只有一个Queue_t结构体大小

在这里插入图片描述


获取信号量

通过队列获取信号量

#define xSemaphoreTake( xSemaphore, xBlockTime )        xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )
BaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue, TickType_t xTicksToWait )for( ;; )
{taskENTER_CRITICAL();        // 关中断{const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting;    // 获取当前信号量值if( uxSemaphoreCount > ( UBaseType_t ) 0 )                            // 信号量值大于0{traceQUEUE_RECEIVE( pxQueue );pxQueue->uxMessagesWaiting = uxSemaphoreCount - ( UBaseType_t ) 1;    // 信号量-1// 检查是否有其他任务阻塞等待信号量。if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE ){// 如果是,解除阻塞最高优先级的任务。// 1、将最高阻塞任务从xTasksWaitingToSend链表中移除;// 2、将最高阻塞任务从从DelayList移动到ReadyList链表if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE ){queueYIELD_IF_USING_PREEMPTION();   // 让出CPU使用权}else{mtCOVERAGE_TEST_MARKER();}}else{mtCOVERAGE_TEST_MARKER();}taskEXIT_CRITICAL();   //开中断return pdPASS;        // 返回成功}else{if( xTicksToWait == ( TickType_t ) 0 ) // 是否愿意等待{// 不愿意等待taskEXIT_CRITICAL();   // 打开中断traceQUEUE_RECEIVE_FAILED( pxQueue );return errQUEUE_EMPTY;   // 返回队列空失败}else if( xEntryTimeSet == pdFALSE ){// 信号量计数为0,阻塞时间被指定,所以配置超时结构准备阻塞。vTaskInternalSetTimeOutState( &xTimeOut );xEntryTimeSet = pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}}taskEXIT_CRITICAL();vTaskSuspendAll();prvLockQueue( pxQueue );if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE ){if( prvIsQueueEmpty( pxQueue ) != pdFALSE ){traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );// 1、当前的任务加入到队列的xTasksWaitingToReceive链表中;// 2、当前的任务从ReadyList移动到DelayListvTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );prvUnlockQueue( pxQueue );if( xTaskResumeAll() == pdFALSE ){portYIELD_WITHIN_API();}else{mtCOVERAGE_TEST_MARKER();}}        else{prvUnlockQueue( pxQueue );( void ) xTaskResumeAll();}}else{...}

释放信号量

#define semGIVE_BLOCK_TIME                    ( ( TickType_t ) 0U )
#define xSemaphoreGive( xSemaphore )        xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )
BaseType_t xQueueGenericSend( QueueHandle_t xQueue, const void * const pvItemToQueue, TickType_t xTicksToWait, const BaseType_t xCopyPosition )
-> for( ;; ){taskENTER_CRITICAL();    // 关中断 portDISABLE_INTERRUPTS();{if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )    // 判断当前信号量是否超过队列信号量长度{        traceQUEUE_SEND( pxQueue );xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );// 不会写数据,但是会将 uxMessagesWaiting +1if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )          // 判断xTasksWaitingToReceive队列里是否有等待的任务{if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE ) // 1、将要写的任务从xTasksWaitingToReceive移除;2、将要写的任务从DelayList移动到ReadyList{queueYIELD_IF_USING_PREEMPTION();    //让出CPU使用权}else{mtCOVERAGE_TEST_MARKER();}}                                else if( xYieldRequired != pdFALSE ){queueYIELD_IF_USING_PREEMPTION();}else{mtCOVERAGE_TEST_MARKER();}}taskEXIT_CRITICAL();    // 开中断return pdPASS;          // 返回成功}else{if( xTicksToWait == ( TickType_t ) 0 ){taskEXIT_CRITICAL();traceQUEUE_SEND_FAILED( pxQueue );return errQUEUE_FULL;         // 返回队列已满}else if( xEntryTimeSet == pdFALSE ){vTaskInternalSetTimeOutState( &xTimeOut ); // 阻塞时间被指定,所以配置超时结构。 xEntryTimeSet = pdTRUE;}else{mtCOVERAGE_TEST_MARKER();}}
}
taskEXIT_CRITICAL();    // 开中断vTaskSuspendAll();
prvLockQueue( pxQueue );if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )
{if( prvIsQueueFull( pxQueue ) != pdFALSE ){traceBLOCKING_ON_QUEUE_SEND( pxQueue );// 1、当前的任务加入到队列的xTasksWaitingToSend链表中;// 2、当前的任务从ReadyList移动到DelayList                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );prvUnlockQueue( pxQueue );if( xTaskResumeAll() == pdFALSE ){portYIELD_WITHIN_API();}}else{prvUnlockQueue( pxQueue );( void ) xTaskResumeAll();}
}
else
{prvUnlockQueue( pxQueue );( void ) xTaskResumeAll();traceQUEUE_SEND_FAILED( pxQueue );return errQUEUE_FULL;
}
}

信号量 内部实现框图

在这里插入图片描述

http://www.dt0577.cn/news/3627.html

相关文章:

  • 腾宁网络做网站app拉新推广代理
  • 云服务器建设简易网站seo推广排名平台有哪些
  • 网站图片设置4:3seo数据分析
  • 网站建设优秀网北京seo排名厂家
  • 黑龙江省建设工程招标网站今日头条搜索优化
  • 唐山制作手机网站网络项目怎么推广
  • 免费企业网站源码生成友谊平台
  • 莱芜金点子广告手机版seo标题优化裤子关键词
  • 电子商城网站建站客专门做排名的软件
  • 延津县建设局网站百度软件下载安装
  • 做网站用什么后缀格式做好百度竞价排名推广
  • 泰安高端网站建设报价快速排名新
  • 移动互联网 网站建设seo关键词优化外包
  • 打不开wordpress百度seo有用吗
  • wordpress菜单侧边栏黑帽seo培训大神
  • 如何借用别人静态网站做模板百度人工客服电话怎么转人工
  • 贵阳企业自助建站系统市场营销培训
  • 网站怎么找开发公司吗广告投放数据分析
  • 现在海外做的比较好一点的网站外贸推广优化公司
  • 网站开发合同中英文百度竞价推广开户联系方式
  • 贵阳网站制作网站快速优化排名软件
  • 大理如何做百度的网站网页代码模板
  • 做手机版网站和做app差别如何用模板做网站
  • 云南网站开发软文推广名词解释
  • 1997年网站建设项目全自动精准引流软件
  • 廊坊专业做网站国家最新新闻
  • 建设银行网站首页打百度网站登录入口
  • cpa怎么做网站什么是seo和sem
  • 做芯片外贸生意上哪个网站武汉seo公司哪家专业
  • 做网站小程序多少钱百度seo公司哪家好一点