chenbingjy 发表于 2024-12-9 14:06

计数型信号量的问题

<p>代码:</p>

<pre>
<code>#include "at32l021_board.h"
#include "at32l021_clock.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "semphr.h"
/** @addtogroup UTILITIES_examples
* @{
*/
QueueHandle_t CountSemaphore;
//unsigned char flag=0;
/** @addtogroup FreeRTOS_demo
* @{
*/
button_type key=1;       
//extern QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,
                                                 //const UBaseType_t uxInitialCount );

static void vPeriodicTassk(void *pvParamters)
{
        unsigned int i;
        UBaseType_t err;
    while(1)
    {       
                                key=at32_adatin_state();
                        if(key==0)
                        {       
                                        for(i=0;i&lt;3000;i++)
                                        {
                                                key=at32_adatin_state();
                                                if(key==0)
                                                {
                                                        while(1)
                                                        {
                                                                key=at32_adatin_state();
                                                                if(key==1)
                                                                        break;
                                                        }
                                        if(CountSemaphore!=NULL)
                                        {
                                                err=xSemaphoreGive(CountSemaphore);
                                               
                                                if(err==pdFALSE)
                                                {
                                                        printf("Sem Rele Failed!\r\n");
                                                        //flag=0;
                                                }
                                                else
                                                {
                                                        printf("Sem Role Succeed!\r\n");
                                                        //flag=1;
                                                }
                                        }
                                }
                        }
                               
      
                                //LED0_TOGGLE();
      //vTaskDelay(10);
                                }/* 延时1000ticks */
    }
}
static void vHandlerTask(void *pvParamters)
{
        unsigned int i;
        UBaseType_t semavalue=0;
    while(1)
    {
                       
                        if(CountSemaphore!=NULL)
                        {
                                //if(flag==1)
                                //{
                                //        flag=0;
                                xSemaphoreTake(CountSemaphore,portMAX_DELAY);
                                semavalue=uxSemaphoreGetCount(CountSemaphore);
                                       
                                        printf("semavalue value=%d\r\n",(int)semavalue);
                                //}
                        }
                        //else
                        //{
                        //        for(i=0;i&lt;1000;i++);
                        //}
                                //printf("Task2 Running!\r\n");
                                //vTaskDelay(1000);
                        for(i=0;i&lt;60000;i++);
    }
}
/**
* @brief main function.
* @paramnone
* @retval none
*/
int main(void)
{
system_clock_config();
        at32_board_init();
/* init led2 and led3 */
at32_led_init(LED2);
at32_led_init(LED3);

/* init usart1 */
uart_print_init(115200);
       
/* enter critical */
taskENTER_CRITICAL();
        CountSemaphore=xSemaphoreCreateCounting(10,10);
                if(CountSemaphore==NULL)
                {
                        printf("create CountSemaphore failed!\r\n");
                }
/* create led2 task */
xTaskCreate((TaskFunction_t )vPeriodicTassk,
               (const char*    )"vTask1",
               (uint16_t       )128,
               (void*          )NULL,
               (UBaseType_t    )2,
               (TaskHandle_t*)NULL);

/* create led3 task */
xTaskCreate((TaskFunction_t )vHandlerTask,
               (const char*    )"vTask2",
               (uint16_t       )128,
               (void*          )NULL,
               (UBaseType_t    )2,
               (TaskHandle_t*)NULL) ;


/* exit critical */
taskEXIT_CRITICAL();

/* start scheduler */
vTaskStartScheduler();
}


/**
* @}
*/

/**
* @}
*/
</code></pre>

<p>这个程序,一运行就收到信号量</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">到零后,按下按键,发送成功,可是收不到信号量。</div>

<div style="text-align: center;">请问高手,这个程序有什么问题?谢谢</div>

<p>&nbsp;</p>
页: [1]
查看完整版本: 计数型信号量的问题