《嵌入式软件的时间分析》-第二章分享:告诉你如何正确的读定时器的计数器
<div class='showpostmsg'> 本帖最后由 qinyunti 于 2024-6-23 15:58 编辑<h1><b>第二章分享</b></h1>
<p>这一章介绍了处理器构造以及CISC和RISC以及CPU的通用寄存器,个人建议再对应到具体典型的架构来说更好比如ARM的。同时介绍了代码执行,存储,流水线,中断,数据一致性等概念,尤其数据一致性时嵌入hi开发中需要非常重视的。</p>
<p> </p>
<p> </p>
<p>这里</p>
<p>小贴士也很有工程实践意义,推荐驱动代码中都详细的进行类似的注释</p>
<p> </p>
<p> </p>
<p> </p>
<p>以图像方式很形象的介绍了临界段问题的一个案例</p>
<p>用图形说话非常推荐,顺带提一句本书的图形都画的非常好,看起来都是作者自己画的而不是很多书籍都是直接截图或者各种复制的。</p>
<p> </p>
<p>说到配图个人还推荐Micrium的文档里面的配图画的非常好,个人觉得是我看过所有书籍里面最好的,没有之一。</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>所以本书一定要仔细阅读,不要漏过任何章节,甚至任意一行,</p>
<p>比如以下的如何正确读取定时器的案例就非常有价值,经验丰富的嵌入式开发者就是不断积累类似经验而成长的。</p>
<p> </p>
<p> </p>
<p> </p>
<p>书中介绍了硬件是如何通过shadow寄存器保证多字节访问时保持同步的,</p>
<p>比如定时器中读写计数器,如果做过嵌入式开发的比如stm32的看过手册的就可以看到各种shadow寄存器。</p>
<p> </p>
<p>实际硬件没有保证同步,软件也是有处理方法的,</p>
<p>还是以上述读取定时器为例,由于高低字节必须分开读,</p>
<p>如果先读高字节再读低字节</p>
<p>比如读高字节时时间是0x00FF读出高字节是0x00,继续读低字节时间变了,变为了了0x0100,此时读到的低字节就是0x00,拼起来就是0x0000,所以读出来是错的。</p>
<p>先读低字节再读高字节也是类似的,比如开始是0x00FF读出低字节是0xFF,接着读高字节此时时间变为了0x0100,读出高字节是0x01,拼起来是0x01FF,读出来也不对。</p>
<p>解决方法是:</p>
<p>可以先读出高字节,再读出低字节,最后再次读出高字节,如果此时高字节和前面的高字节一样说明高字节没有变说明低字节没有进位,此此读出的高低字节拼起来即可。</p>
<p>如果此时高字节变了则需要重复上述过程。</p>
<p> </p>
<p> </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>
页:
[1]