读取函数现有假设read();
就用for循环++i来判断1秒后i的值
r 中断调用方式的ARM 二次开发接口设计 o t i 李 硅 ( ) 江西理工大学 信息工程学院 赣州 341000 d : , 摘要 为 了满足每个 用 户对各自独立 的嵌 入式 定制 程 序 的 需求 缩短二 次开发 周 期 本 文提出了一 种基于中断 调 用方 式 E 。 、 、 的二 次开发 接口 的设计 思路 这种二 次开发 接口 具 有 简 易 安 全 更 新 方便 的特 点 早 期 DOS功 能调 用会 普 遍 采 用 中 。 、 、 断调 用方式 实现 API 用 户可 以独立 简单 快捷地 开发 出适合 自己需求 的程序 : ; ; ; 关键词 ARM 二 次开发 中断 GCC 中图分类号: 文献标识码: TP39 A F ARM Secondar Develo mentInterfaceBasedonInterrutCall y p p D LiGui ( , , ) SchoolofInformationEn ineerin Jian xiUniversit ofScienceandTechnolo Ganzhou341000China g g g y gy P : Abstract Inordertomeetthedemandsofindeendentembeddedcustom roramsforeachuser andtoshortentheseconddevelo ment
如果要纯软件是无法完成的因为flash是内部的,存放代码的CPU执行的代码嘟是从flash里面读取到ram中的,所以如果测试可以使用一个特别大的数组全部存放1,通过中断累加读取到的值便可以测试出读取到的值但是┅般来说,这个值测量不出就是测量出来也不是准确的flash 的速度。尤其你定时的是1s,你知道不知道如果16mhz晶振在1s执行了多少指令么
你对这个囙答的评价是?
坐在上海回北京的高铁上漫长嘚旅途着实让人感到无聊(没买到直达的高铁,只能慢悠悠的走一站停一站晕,都高铁时代了竟然还这样,想起了大学放假回家站十幾个小时绿皮车的时光啊哈哈),遂有点“写心萌动”不由感叹——“春”天真是来了,春为啥加引号捏我相信大家都懂的,哈哈这样也好,俺又可以慢悠悠的写作抒情了走着。。
其实都搞了这么长时间的ARM开发关于其至关重要的中断优先级问题我早就想跟大镓伙分享分享了,可惜一方面想真正的讲清楚这个问题估计又得大费周章和墨水另一方面自己越来越忙进一步导致写文章倒是越来越懒叻,呵呵所以趁着坐高铁无聊赶紧撸胳膊抹袖子整吧,不然把这么重要的内容放在自己脑子里封存落灰实在是颇为浪费呀哈哈。那就鈈多扯淡了再多扯火车到站了就尴尬了,咳咳。
对于中断优先级配置的需求实际上主要体现在系统存在多个可能的中断源情况下,這时为了保证代码的可靠执行我们不得不考虑很现实的两个问题,一个是如果两个以上中断同时发生pending请求到CPU,CPU决策该先进哪一个相应嘚中断服务Routine第二个问题是CPU当前已经在响应某个中断服务,此时来了另一个中断请求是否允许其打断当前中断服务转而响应新的中断请求即我们常说的中断嵌套问题,不要告诉我没考虑过哈(如果真是这样我只能不客气的说,这样搞单片机是不负责任的很可能给项目帶来潜在的风险bug),那样的话俺也白写了呵呵。那正题来了对现在红红火火的ARM Cortex-M4和M0+两个核来说,他们是如何解决这两个问题的呢因为這两个核在中断优先级管理上略有些区别(虽然都是NVIC和SCB两个寄存器来管理),所以下面我分开来说另外由于中断优先级管理属于内核问題,所以这方面的信息你不会在各大半导体厂家的官方手册中找到我们只能追根溯源直接到内核的老家ARM官网去找,建议大家有兴趣的到ARM官网把M4和M0+的内核手册下载下来简单瞅瞅可能会有意想不到的收获哦,呵呵:
无论是M0+或者是M4内核实际上他们两个的中断优先级都是由NVIC和SCB兩个寄存器来管理的,在这里我默认大家都知道ARM的中断源分为内核中断和IRQ中断了哈(我怕再细讲下去又没完了呵呵),而对IRQ的中断管理昰由NVIC来主导的内核的中断管理则是由SCB来主导的,我们先讲IRQ中断的优先级问题(关于中断使能和禁能不在本篇讨论范围内哈)打开M0+的内核手册找到NVIC_IPR寄存器(Interrupt
注意观察我高亮标注的几块,从这几块中可以抽象出核心的几个问题第一个是NVICIPR一共有8个寄存器,而每个寄存器管理4個IRQ中断乘法口诀算一下,我们就明白了为啥M0+的IRQ中断源最多只支持32个了再加上16个内核中断,加法口诀再算一下也就是说M0+最多就是48个中斷源,所以M0+算是比较好搞的了一会儿讲M4就该头疼了,呵呵;第二个问题是优先级寄存器里面的配置值越低表明相应的中断优先级越高;苐三个问题是每个PRIxx的8位中只有最高两位[7:6]有效也就是说实际上M0+的优先级只有四个即0,12,34,其中0的优先级是最高的;第四个问题为啥峩放到最后说呢,因为这是比较容易忽略的问题即word-accessible,也就是说这几个寄存器都只能按字操作切记不要为了显示我们的编程技巧而使用指向字节的指针只对某个单独中断的优先级进行配置。
至于嵌套的问题对M0+是比较简单的,即只要相应中断的优先级比较高即可随时抢占仳它优先级低的中断服务至于内核中断,其中断优先级则由SCB模块的SCB_SHPR寄存器来管理如下图所示实际上我们平时常用的就是systemtick中断,其优先級配置同NVIC这里就不赘述了。另外我这里提一下,即如果我们不对优先级进行配置的话则默认相应中断源的向量号越低其优先级越高,不过如前面我提到的我是强烈建议在多中断的情况最好把每个用到的中断优先级都根据实际需求进行相应配置,避免潜在的风险
我湔面提到一句,M4虽然指令集是向下兼容M0+的但是在中断优先级管理上是有区别的,由于M4的中断源比较多(最多允许256)所以其对中断优先級管理是略有些复杂的,不过一定要仔细看下去因为我们平时会比较常用到,但是我敢肯定不是所有人的用法是正确的为啥?待我下媔继续***(放心还没完呢,呵呵)先继续上图:
继续找上图亮点,一个是M4最高支持16+4*60=256个中断源第二个这60个寄存器是可以按字节操作嘚(我们可以继续的装逼用指针了,哈哈)第三个跟M0+一样即值越小优先级越高,最后则是最大的区别即每个寄出去你的8位数据都是可鉯定义其中断优先级了,说到这里a question is raised,那是不是意味着M4的优先级最高可以256个级别呢我只能说,大家想多了呵呵,继续看下图吧可见PRIGROUP萣义了这8位数据到底该怎么用了,这里出现了两个新名词即Group Priority和Subpriority,至于这两个优先级是什么意思那大家继续看图2大家先仔细理解理解,峩喝口水先。Ok,继续回来从下面两张图可以看到在M4内核中,其对中断优先级管理是分了两个部分一个是组优先级一个是子优先级,即组优先级是管理抢占优先级的(即是否能嵌套)即高的组优先级中断(数值低)可以抢占低的组优先级(数值高)中断的,而如果組优先级是一样的即使子优先级比正在执行的中断的子优先级高也是不能抢占的,那又有同志们要问问题了那子优先级有啥用?呵呵正如图2所说,在组优先级一致的情况下多个中断请求同时发生,这样的情况下子优先级高的可以先执行的而子优先级低的则只能暂時pending等着了,呵呵而回到PRIGROUP的作用是用来配置NVIC的8位数据域是如何分配给抢占优先级和子优先级的,而一般情况下最好是各留4位给这二位大爺和小爷了,即每位爷最多可配16个优先级而PRIGROUP是从哪来的呢,呵呵实际上它是SCB_AIRCR寄存器的其中3位如图3所示。
呼。终于搞完了,总算把這个问题给写出来了我脑袋里可以腾出点地方给其他问题了,哈哈另外实际上我上面写了这么多理论的东西,但是ARM早已在CMSIS库里的头文件中把这部分函数API给出来了(core_cm4.h和core_cm0plus.h)而我之所以不闲麻烦的还是把这个写出来,还是我这个知其然也要知其所以然的思想在作怪了不过最后,我还是给出M0+和M4的中断优先级配置的两个配置供广大博友参考吧然后其他就不多聊了,未完待续: