<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

        freertos創建函數xTaskCreate( vIntegerGenerator, IntGen, 200, NULL, 1, NULL)

        作者:未知   來源:布冬冬 的空間   點擊數:  更新時間:2014年08月16日   【字體:

         

         
         
        signed portBASE_TYPE xTaskGenericCreate( pdTASK_CODE pxTaskCode, const signed char * const pcName, unsigned short usStackDepth, void *pvParameters, unsigned portBASE_TYPE uxPriority, xTaskHandle *pxCreatedTask, portSTACK_TYPE *puxStackBuffer, const xMemoryRegion * const xRegions )
        {
        signed portBASE_TYPE xReturn;
        tskTCB * pxNewTCB;
         
         configASSERT( pxTaskCode );
         configASSERT( ( uxPriority < configMAX_PRIORITIES ) );
         
         //分配任務TCB和堆棧
         pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );
         
         if( pxNewTCB != NULL )
         {
          portSTACK_TYPE *pxTopOfStack;
         
          #if( portUSING_MPU_WRAPPERS == 1 )
           
           portBASE_TYPE xRunPrivileged;
           if( ( uxPriority & portPRIVILEGE_BIT ) != 0U )
           {
            xRunPrivileged = pdTRUE;
           }
           else
           {
            xRunPrivileged = pdFALSE;
           }
           uxPriority &= ~portPRIVILEGE_BIT;
          #endif
         
        //判斷堆棧增長方式是否是由高到低增長
          #if( portSTACK_GROWTH < 0 )
          {
           pxTopOfStack = pxNewTCB->pxStack + ( usStackDepth - ( unsigned short ) 1 );
         
        //保持堆棧為字節對齊?
           pxTopOfStack = ( portSTACK_TYPE * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ( portPOINTER_SIZE_TYPE ) ~portBYTE_ALIGNMENT_MASK  ) );
         
           
           configASSERT( ( ( ( unsigned long ) pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
          }
          #else
          {
           pxTopOfStack = pxNewTCB->pxStack;
           
           
           configASSERT( ( ( ( unsigned long ) pxNewTCB->pxStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
         
           
           pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( usStackDepth - 1 );
          }
          #endif
         
          //TCB初始化
          prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth );
         
          
          #if( portUSING_MPU_WRAPPERS == 1 )
          {
           pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged );
          }
          #else
          {
         
        //匯編語言對堆棧進行初始化
           pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );
          }
          #endif
         
          
          portALIGNMENT_ASSERT_pxCurrentTCB( ( ( ( unsigned long ) pxNewTCB->pxTopOfStack & ( unsigned long ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
         
          if( ( void * ) pxCreatedTask != NULL )
          {
           
           *pxCreatedTask = ( xTaskHandle ) pxNewTCB;
          }
          
          
         
         
          taskENTER_CRITICAL();
          {
           uxCurrentNumberOfTasks++;//更新系統任務數
           if( pxCurrentTCB == NULL )
           {
            
            pxCurrentTCB =  pxNewTCB;
         
            if( uxCurrentNumberOfTasks == ( unsigned portBASE_TYPE ) 1 )
            {
             //如果當前任務數為1的話,則證明米有初始化就緒列表,等待列表,掛起列表等
         
            //初始化就緒列表的時候,定義優先級為一個數據數組,則每個數據數組的元素代表一個優先級
         
        //其他列表則沒有這么復雜 直接定義 不區分優先級
             prvInitialiseTaskLists();
            }
           }
           else
           {
            //比較,將當前最高的優先級賦給pxCurrentTCB
            if( xSchedulerRunning == pdFALSE )
            {
             if( pxCurrentTCB->uxPriority <= uxPriority )
             {
              pxCurrentTCB = pxNewTCB;
             }
            }
           }
         
           //更新uxTopUsedPriority,方便查詢的時候直接從uxTopUsedPriority開始查詢
           if( pxNewTCB->uxPriority > uxTopUsedPriority )
           {
            uxTopUsedPriority = pxNewTCB->uxPriority;
           }
         
           #if ( configUSE_TRACE_FACILITY == 1 )
           {
            
            pxNewTCB->uxTCBNumber = uxTCBNumber;
           }
           #endif
           uxTCBNumber++;
         
        //將任務添加到就緒列表中。當任務處于阻塞態的時候,從就緒列表中刪除,加入到阻塞列表中。
         
           prvAddTaskToReadyQueue( pxNewTCB );
         
           xReturn = pdPASS;
           traceTASK_CREATE( pxNewTCB );
          }
          taskEXIT_CRITICAL();
         }
         else
         {
          xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
          traceTASK_CREATE_FAILED();
         }
         
         if( xReturn == pdPASS )
         {
          if( xSchedulerRunning != pdFALSE )
          {
           
           if( pxCurrentTCB->uxPriority < uxPriority )
           {
            portYIELD_WITHIN_API();
           }
          }
         }
         
         return xReturn;
        }
         
        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮