本帖最后由 ddllxxrr 于 2020-12-15 19:38 编辑
二值信号量任务与任务、中断与任务之间的同步。简单地说就是0和1的值。
首先用STM32CUBEMX建立一个二值信号量:
再点GPIO,在GPIO设置中,将NVIC,也就是板子上B1按键中断使能,
点生成程序。
在生成的程序中找到中断的代码:加入如下内容:
void EXTI15_10_IRQHandler(void)
{
/* USER CODE BEGIN EXTI15_10_IRQn 0 */
/* USER CODE END EXTI15_10_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
/* USER CODE BEGIN EXTI15_10_IRQn 1 */
/* USER CODE END EXTI15_10_IRQn 1 */
}
void HAL_GPIO_EXIT_Callback(uint16_t GPIO_Pin)
{
osSemaphoreRelease(myBinarySem01Handle);
}
再建立个线程,优先级都是默认:
这个线程是在收到由按键发来的信号后,发出一串字符:“I got it !!!”
/* USER CODE END Header_StartTask02 */
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
osSemaphoreWait(myBinarySem01Handle, osWaitForever);
HAL_UART_Transmit(&huart2,TxData2,15,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff
osDelay(1);
}
/* USER CODE END StartTask02 */
}
实验现象:
当按下B1键并抬起时会发出“I got it!!!"
总结一下,如果程序不是抢占的情况下我觉得就用不着同步,只有个别程序老是抢着运行这就是制造麻烦,而RTOS中设一大批函数及信号量来解决这一问题。
谁有本事就几个线程不用抢占我想也会跑的很好。上述的程序有个缺点,就是只有在B1键抬起时,才能往下走,也就是说B1不抬起,始终是中断状态。
本人HAL不是很熟,这几天找一找再说吧。