【NUCLEO-L452RE测评】+按键控制发个二值信号量
<div class='showpostmsg'> 本帖最后由 ddllxxrr 于 2020-12-15 19:38 编辑<p>二值信号量任务与任务、中断与任务之间的同步。简单地说就是0和1的值。</p>
<p> </p>
<p>首先用STM32CUBEMX建立一个二值信号量:</p>
<p> </p>
<p> </p>
<p></p>
<p> </p>
<p>再点GPIO,在GPIO设置中,将NVIC,也就是板子上B1按键中断使能,</p>
<p></p>
<p>点生成程序。</p>
<p> </p>
<p>在生成的程序中找到中断的代码:加入如下内容:</p>
<pre>
<code>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);
}</code></pre>
<p>再建立个线程,优先级都是默认:</p>
<p>这个线程是在收到由按键发来的信号后,发出一串字符:“I got it !!!”</p>
<pre>
<code>/* 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 */
}</code></pre>
<p>实验现象:</p>
<p>当按下B1键并抬起时会发出“I got it!!!"</p>
<p></p>
<p> </p>
<p> </p>
<p>总结一下,如果程序不是抢占的情况下我觉得就用不着同步,只有个别程序老是抢着运行这就是制造麻烦,而RTOS中设一大批函数及信号量来解决这一问题。</p>
<p>谁有本事就几个线程不用抢占我想也会跑的很好。上述的程序有个缺点,就是只有在B1键抬起时,才能往下走,也就是说B1不抬起,始终是中断状态。</p>
<p>本人HAL不是很熟,这几天找一找再说吧。</p>
</div><script> var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;" style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
if(parseInt(discuz_uid)==0){
(function($){
var postHeight = getTextHeight(400);
$(".showpostmsg").html($(".showpostmsg").html());
$(".showpostmsg").after(loginstr);
$(".showpostmsg").css({height:postHeight,overflow:"hidden"});
})(jQuery);
} </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script> <p><strong><a href="https://bbs.eeworld.com.cn/elecplay/content/148" target="_blank">ST NUCLEO-L452RE测评</a></strong></p>
<p>汇总贴:<a href="https://bbs.eeworld.com.cn/thread-1151850-1-1.html" target="_blank">https://bbs.eeworld.com.cn/thread-1151850-1-1.html </a>、</p>
<p>居然可以直接用CubeMX写信号量,后面我得试试。</p>
页:
[1]