第四讲ARM汇编语言与嵌入式C混合编程.pptVIP

第四讲ARM汇编语言与嵌入式C混合编程.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第四讲ARM汇编语言与嵌入式C混合编程

满足下列条件的函数多数是不可重入的: (1)函数体内使用了静态的数据结构; (2)函数体内调用了malloc()或者free()函数; (3)函数体内调用了标准I/O函数。 可重入函数的编写规则 第一,不要使用全局变量。因为别的代码很可能覆盖这些变量值。 第二,在和硬件发生交互的时候,切记执行类似disinterrupt()之类的操作,就是关闭硬件中断。完成交互记得打开中断,在有些系列上,这叫做“进入/退出核心”或者用OS_ENTER_KERNAL/OS_EXIT_KERNAL来描述。 第三,不能调用任何不可重入的函数。 第四,谨慎使用堆栈。 还有一些规则,都是很好理解的,总之,时刻记住一句话:保证中断是安全的! 通俗的来讲吧:由于中断是可能随时发生的,断点位置也是无法预期的。所以必须保证每个函数都具有不被中断发生,压栈,转向ISR,弹栈后继续执行影响的稳定性。也就是说具有不会被中断影响的能力。既然有这个要求,你提供和编写的每个函数就不能拿公共的资源或者是变量来使用,因为该函数使用的同时,ISR(中断服务程序)也可那会去修改或者是获取这个资源,从而有可能使中断返回之后,这部分公用的资源已经面目全非。 可重入性中断   如果希望在处理中断时仍能响应其他中断请求以此来缩短中断延时,就必须设计可重人性中断。可重入性中断是处理多个中断的一种方法,但它也同时带来新的问题。在IRQ中断模式中,如果直接重新允许了IRQ中断,此时因为执行一条BL指令而将子程序返回的地址保存在LR_irq中,而在此间中断发生了。新来的中断会将其返回地址装入LR_irq中,此时旧中断子程序的返回地址必将被覆盖从而导致系统紊乱。   但是仍不能排除在保存LR之前中断发生的可能性。要解决LR_irq被破坏的问题,就必须切换处理器的模式,常见的是切换到SVC处理模式。在SVC模式中,通过BL调用子程序时会将返回地址保存在LR_SVC之中。此时新中断发生(因为它会将返回地址保存到LR_irq而不是LR_SVC),不会破坏旧中断中子程序返回地址了。有了基于上述的原理分析再来编写可重入性中断的代码就思路清晰了。但是为了保证处理的高效性,尽可能地及早允许中断以缩短延时,在保存完LR_irq和SPSR_irq后,就马上切换到SVC模式中并重新允许中断,如图4所示(虚线是压栈保存,实线是弹栈恢复)。 (3). 宏定义与函数 带参宏与函数的区别 文件包含(#include) 文件包含的功能是使得一个源文件可以将另一个源文件的内容全部包含进来,它的一般形式为: #include “文件名” //先搜索当前目录,再搜索标准目录,可以指定目录 #include文件名 //直接按标准目录搜索 /*头文件test.h */ #define SQR(x) ((x)*(x)) #define CUBE(x) ((x)*(x)*(x)) #define QUAD(x) ((x)*(x)*(x)*(x)) /*源文件 test.c*/ #include stdio.h #include e:\qiutie\test.h //指定目录,包含头文件 #define MAX_POWER 10 void main() { int n; printf(number\t exp2\t exp3\t exp4\n); printf(----\t----\t-----\t------\n); for(n=1;n=MAX_POWER;n++) printf(%2d\t %3d\t %4d\t %5d\n,n,SQR(n),CUBE(n),QUAD(n)); } 程序运行结果 条件编译 (1). 形式1: #ifdef 标识符 程序段1 #else 程序段2 #endif (2). 形式2 #ifndef 标识符 程序段1 #else 程序段2 #endif (3). 形式3 #ifdef 表达式1 程序段1 #elif 表达式2 程序段2 #else 程序段3 #endif 8.4嵌入式C程序设计格式 8.4.1 可重入函数 8.4.2 中断处理程序 8.4.3 模块化程序设计 8.4.1 可重入函数 如果某个函数可以被多个任务并发使用,而不会造成数据错误,我们就说这个函数具有可重入性(reentrant) 。 一个可重入的函数简单来说就是可以被中断的函数 。 可重入函数可以使用局部变量,也可以使用全局变量。 如果使用全局变量,则应通过关中断、信号量(即P、V操作)等手段对其加以保护 示例解析: 分析下面的函数是否具有可重入性 static int tmp; void swap(int* a, int* b) { tm

文档评论(0)

zilaiye + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档