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

做百度网站图片怎么做友情链接的定义

做百度网站图片怎么做,友情链接的定义,网站文件app,深圳市宝安区人民政府官网文章目录 基础知识创建信号量获取信号量释放信号量信号量 内部实现框图 基础知识 [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.ds6.com.cn/news/71510.html

相关文章:

  • asp.net做织梦网站关键词搜索量怎么查
  • 网站制作的公司有哪些广州婚恋网站排名
  • 漳州网站建设求职简历页面设计
  • 开封公司做网站青岛关键词优化平台
  • 时时彩网站代理怎么做?网站排名软件包年
  • go网站开发google seo是什么啊
  • 网站开发支付功能怎么做个人网站免费域名和服务器
  • 物流公司网站 源码营销型企业网站有哪些
  • 做网站效果图是用ps还是ai百度权重划分等级
  • 比价网站模板新手运营从哪开始学
  • 网站备案号怎么添加相城seo网站优化软件
  • 安居客网站怎么做想要导航推广网页怎么做
  • 单仁资讯做网站怎样网站搜索引擎优化
  • web网站建设论文关键词优化策略有哪些
  • wordpress显示id久久seo正规吗
  • 用手机什么软件做网站推广形式
  • 劳务公司网站怎么做免费的网站推广软件
  • 全自动站群系统seo完整教程视频教程
  • 企业营销管理天津百度推广排名优化
  • 学校网站建设规划书什么是seo搜索
  • 西安网站开发的空间熊猫关键词挖掘工具
  • 网站seo的优化怎么做软文网站模板
  • 合肥专门做网站的公司有哪些seo网站优化培训找哪些
  • o2o与网站建设中国十大互联网公司排名
  • 做网站跟网站设计的区别今日头条普通版
  • 三拼域名做网站百度网首页登录入口
  • 做网站买完域名还需要什么seo能干一辈子吗
  • 网站制作编辑软件百度知道网页版进入
  • 做网站的公司多少钱代写
  • 网站两侧对联广告图片教育培训班