ddllxxrr 发表于 2020-12-15 19:36

【NUCLEO-L452RE测评】+按键控制发个二值信号量

<div class='showpostmsg'> 本帖最后由 ddllxxrr 于 2020-12-15 19:38 编辑

<p>二值信号量任务与任务、中断与任务之间的同步。简单地说就是0和1的值。</p>

<p>&nbsp;</p>

<p>首先用STM32CUBEMX建立一个二值信号量:</p>

<p>&nbsp;</p>

<p>&nbsp;</p>

<p></p>

<p>&nbsp;</p>

<p>再点GPIO,在GPIO设置中,将NVIC,也就是板子上B1按键中断使能,</p>

<p></p>

<p>点生成程序。</p>

<p>&nbsp;</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>这个线程是在收到由按键发来的信号后,发出一串字符:&ldquo;I got it !!!&rdquo;</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(&amp;huart2,TxData2,15,0xffff);//把TxData的内容通过uart2发送出去,长度是10,timeout的时间是最大值0xffff
                osDelay(1);
}
/* USER CODE END StartTask02 */
}</code></pre>

<p>实验现象:</p>

<p>当按下B1键并抬起时会发出&ldquo;I got it!!!&quot;</p>

<p></p>

<p>&nbsp;</p>

<p>&nbsp;</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>

okhxyyo 发表于 2020-12-21 14:31

<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&nbsp;</a>、</p>

w494143467 发表于 2020-12-15 20:33

<p>居然可以直接用CubeMX写信号量,后面我得试试。</p>
页: [1]
查看完整版本: 【NUCLEO-L452RE测评】+按键控制发个二值信号量