manhuami2007 发表于 2023-8-17 16:58

[ST NUCLEO-WBA52CG] 3 - BLE中的sequencer -- UTIL_SEQ_RegTask()函数的作用

<div class='showpostmsg'><p>在生成的BLE工程里能看到很多地方出现了 <em>UTIL_SEQ_RegTask</em><em>() </em>函数。通过跳转的功能,可以发现其是STM32提供的一个库函数,出现在 <em>Utilities </em>文件夹中,是sequencer下的函数。那么sequencer是做什么的呢?</p>

<p>&nbsp;</p>

<p>sequencer提供了一种类似于前后台架构中,对后台程序的一系列管理函数。Sequencer本质是一个while循环,在这个循环中通过判断标志位来确定是否要执行某个函数。</p>

<p>在这个文件里包含以下主要函数:</p>

<ul>
        <li>UTIL_SEQ_Idle() 当sequencer中没有要执行的函数时,进入idle状态,也就是调用该函数,这个函数处于临界区,也就是禁用中断的状态。</li>
        <li>UTIL_SEQ_PreIdle() 这个函数在 <em>UT</em><em>IL_SEQ_Idle()</em> 之前,但是它没在临界区</li>
        <li>UTIL_SEQ_PostIdle() 同理这个函数在<em>UTIL_SEQ_Idle()</em> 之后,也是没在临界区</li>
        <li>UTIL_SEQ_Run() 为while循环,并在该循环中执行用户注册进去的程序</li>
        <li>UTIL_SEQ_RegTask() 通过该函数将程序注册到sequencer的while循环中</li>
        <li>UTIL_SEQ_SetTask() 设置注册函数的标志位,是的某个注册函数开始执行</li>
        <li>UTIL_SEQ_PauseTask() 暂停一个程序,此时通过 UTIL_SEQ_SetTask() 设置了标志位之后,也不执行</li>
        <li>UTIL_SEQ_ResumeTask() 恢复一个程序</li>
        <li>UTIL_SEQ_WaitEvt() 设置某个程序等待一个事件,类似于OS里的信号量</li>
        <li>UTIL_SEQ_SetEvt() 设置事件</li>
        <li>UTIL_SEQ_IsEvtPend() 判断是否在等待事件</li>
</ul>

<p>Sequencer虽然提供的功能有点像OS的功能,但它只是一个while循环,其执行结构如下图所示,这个结构其实就是<em>UTIL_SEQ_Run()</em> 的内容。</p>

<p></p>

<p>Sequencer最多注册32个函数,因为其使用一个uint32_t 的数据保存标志位,其中每个位能够指代一个函数。</p>

<p><strong>总结</strong></p>

<p>在sequencer里见到最多的是UTIL_SEQ_RegTask() 函数,这个函数的作用就是将一个函数注册到后台中等待执行。通过调用UTIL_SEQ_SetTask() 函数,可以控制已经注册的函数开始执行。</p>

<p>下面的附件为ST对sequencer介绍的PPT。</p>

<div></div>
</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>

lugl4313820 发表于 2023-8-18 06:56

<p>在sequencer里见到最多的是UTIL_SEQ_RegTask() 函数,这个函数的作用就是将一个函数注册到后台中等待执行。通过调用UTIL_SEQ_SetTask() 函数,可以控制已经注册的函数开始执行。</p>

<p>学习了</p>
页: [1]
查看完整版本: [ST NUCLEO-WBA52CG] 3 - BLE中的sequencer -- UTIL_SEQ_RegTask()函数的作用