freertos-互斥量

static void LowPriority_Task(void* parameter) 
{ 
    static uint32_t i; 
    BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */ 
    while (1) 
    { 
        //printf("LowPriority_Task 获取信号量\n"); 
        //获取互斥量 MuxSem,没获取到则一直等待 
        xReturn = xSemaphoreTake(MuxSem_Handle,/* 互斥量句柄 */ 
                                portMAX_DELAY); /* 等待时间 */ 
        if (pdTRUE == xReturn) 
        {
           // printf("LowPriority_Task Runing\n\n"); 
        }
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
				vTaskDelay(180);
				HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
				HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
				vTaskDelay(110);
        //for (i=0; i<2000000; i++) 
        { //模拟低优先级任务占用互斥量 
            //taskYIELD();//发起任务调度 
        } 

        //printf("LowPriority_Task 释放信号量!\r\n"); 
        xReturn = xSemaphoreGive( MuxSem_Handle );//给出互斥量 
       // LED1_TOGGLE; 

        vTaskDelay(50); 
    }
} 

static void HighPriority_Task(void* parameter) 
{ 
    BaseType_t xReturn = pdTRUE;/* 定义一个创建信息返回值,默认为 pdPASS */ 
    while (1) 
    { 
        //printf("HighPriority_Task 获取信号量\n"); 
        //获取互斥量 MuxSem,没获取到则一直等待 
        xReturn = xSemaphoreTake(MuxSem_Handle,/* 互斥量句柄 */ 
                                portMAX_DELAY); /* 等待时间 */ 
				if (pdTRUE == xReturn) 
        {
            HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
						HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);
						vTaskDelay(280);
						HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET);
						HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
						vTaskDelay(130);
            xReturn = xSemaphoreGive(MuxSem_Handle); 
            if (pdTRUE == xReturn)
                flag=2;
        }
        vTaskDelay(40); // 释放 CPU
    }
} 

void MX_FREERTOS_Init(void) {
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* USER CODE BEGIN RTOS_MUTEX */
  /* add mutexes, ... */
  /* USER CODE END RTOS_MUTEX */

  /* USER CODE BEGIN RTOS_SEMAPHORES */
  /* add semaphores, ... */
  /* USER CODE END RTOS_SEMAPHORES */

  /* USER CODE BEGIN RTOS_TIMERS */
  /* start timers, add new ones, ... */
  /* USER CODE END RTOS_TIMERS */

  /* USER CODE BEGIN RTOS_QUEUES */
  /* add queues, ... */
  /* USER CODE END RTOS_QUEUES */

  /* Create the thread(s) */
  /* creation of defaultTask */
  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);
MuxSem_Handle = xSemaphoreCreateMutex();
	 if (NULL != MuxSem_Handle) 
	 {
			//printf("MuxSem_Handle 互斥量创建成功!\r\n"); 
	 }
	 BaseType_t xReturn = pdPASS;
	 xReturn = xSemaphoreGive( MuxSem_Handle );
	 if (pdPASS == xReturn)
   {
     //   printf("创建 LowPriority_Task 任务成功!\r\n");
   }
		if (xTaskCreate(HighPriority_Task, "High", 128, NULL, 3, &xSenderTask) != pdPASS) {
				// 创建失败处理
				Error_Handler();
		}

		// 创建低优先级任务
		if (xTaskCreate(LowPriority_Task, "Low", 128, NULL, 1, &xReceiverTask) != pdPASS) {
				// 创建失败处理
				Error_Handler();
		}
		

		// 启动调度器
		vTaskStartScheduler();
  /* USER CODE END RTOS_THREADS */

  /* USER CODE BEGIN RTOS_EVENTS */
  /* add events, ... */
  /* USER CODE END RTOS_EVENTS */

}

运行结果如下 

 可以看到互斥量对硬件的保护,即一个任务执行时不会被另一个打断。

下午一直是一个任务运行,另一个任务不执行,找了一下午发现是c8t6的存储空间不支持两个512,创建第二个任务都是失败的,换成两个128就好了。

还要注意freertosconfig.h

#define configCHECK_FOR_STACK_OVERFLOW 2
#define configSUPPORT_DYNAMIC_ALLOCATION 1
#define configUSE_MUTEXES 1
#define configUSE_PREEMPTION         1
#define configUSE_TIME_SLICING       1  // 启用时间片轮转
#define configUSE_MUTEXES            1
#define configTICK_RATE_HZ           ((TickType_t)1000) // 1ms时基

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值