用C语言写的程序为求模块化,一般函数数量较多,函数调用的嵌套层数也多,要从一个较深的嵌套立刻跳出到主函数,是非常困难的。用break或者return是跳不出来的,一般的解决方法或是使用C51的库函数setjmp()和longjmp()实现长跳转,但是这两个函数在中断函数内部是无能为力的;再或是在C函数中嵌入汇编。虽然用汇编指令可以实现程序的长距离跳转,但是这种方法的调试过程十分烦琐,而且程序的可移植性差。对于习惯用C51编程而不想用汇编的设计者,该部分程序是一个难题。

我们可以利用keil软件的绝对地址跳转,((void(code *)(void))0x00)(); keil软件编译时会转换成jmp  0x00,就跳到指定的绝对地址了;

但这又有些不方便,我们想跳到任何我们想跳到的地方去,而程序一改动,绝对地址又会变,所以我们需要一个函数能够取得我们要跳转的绝对地址,但又不能直接读取程序计数器PC(绝对地址);

方法还是有的:因为单片机c语言调用函数或者进入中断时,都要线把PC压入堆栈去,而SP值是可以读的,因此调用函数,把堆栈里的值(PC)读出保存,作为跳转的据对地址;例程如下:

ff0()

{

....................................

JmpAddr=Get_Jmp_Addr();//------------取要跳转地址

.........................................

}

long Get_Jmp_Addr(void)

{         long address;

address=*((unsigned char *)SP);

address <<= 8;

address+=*((unsigned char *)(SP-1));

return address+5;

}

ff1()

{

.........................

((void(code *)(void))JmpAddr)();

................................

}

希望对大家有帮助!!

另 转 其实uboot里面就有例子,不过今天看到一个TI的,也贴出来,实际差不了多少:

定义:

Uint32 gEntryPoint;

static void (*APPEntry)(void);

用法:

APPEntry = (void (*)(void)) gEntryPoint;
  (*APPEntry)();

单片机C语言任何位置跳转到任何指定地址 -转相关推荐

  1. js 跳转到 百度指定地址定位点

    js 跳转到 百度指定地址定位点 http://api.map.baidu.com/geocoder?address=北京市海淀区上地信息路9号奎科科技大厦&output=html&s ...

  2. 单片机c语言有没有跳转指令,51单片机跳转指令

    @ 无条件转移bai指令(共4条) LJMP addr16 : PC〈-du- addr16 AJMP addr11 : PC〈-- PC+2 , PC10-0〈-- addr11 SJMP rel ...

  3. 单片机c语言reti的用法,基于51单片机中断跳出指令“RETI”浅议

    原标题:基于51单片机中断跳出指令"RETI"浅议 =RET指令+通知CPU中断服务已结束. 最近在基于编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET ...

  4. 单片机c语言reti的用法,谈谈51单片机的RETI指令

    最近在基于51单片机编程的过程中出现了个很奇怪的问题"程序执行中在寄存器EA=1,ET0=1,TR0=1条件下,单TF0=1时并没有执行中断". 在有过单片机中断编程经历者都知道当 ...

  5. java跨函数跳转_C语言中将绝对地址转换为函数指针以及跳转到内存指定位置处执行的技巧...

    1.方法一 要对绝对地址0x100000赋值,我们可以用 (unsigned int  * ) 0x100000 = 1234; 那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做? ...

  6. 51单片机c语言编程函数,单片机C语言教程:C51函数

    其实一直出现在例子中的 main()也算是一个函数,只不过它比较特殊,编译时以它做为程序的开始段.有了函数C 语言就有了模块化的优点,一般功能较多的程序,会在编写程序时把每项单独的功能分成数个子程序模 ...

  7. avr-gcc与avr单片机c语言开发 pdf,AVR 单片机与GCC 编程使用方法

    原标题:AVR 单片机与GCC 编程使用方法 WIN 是一个ATMEL AVR 系列 的开发工具集,它包含GNU C 和C++编译器 . 1.1 一个简单的例子 为了先有一个感性的认识,我们首先看一下 ...

  8. 单片机c语言编译软件6,eUIDE下载-单片机c语言编译器 v1.07.32.23 官方版 - 安下载...

    eUIDE是一款专业的单片机c语言编译器,EM78系列集成开发环境是面向项目的ELAN EM78系列微控制器的开发工具,它包括UICE开发在线仿真器和eUIDE软件工具:eUIDE是基于PC端的UIC ...

  9. 单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc

    (整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的 ...

最新文章

  1. python字典用法(创建、添加、删除(del()、clear()、pop()、popitem())、修改、查找(get()、keys()、values()、items())、更新update、遍历)
  2. php goto call,Php中的goto用法
  3. java前后端分离的实现方式_采用前后端分离的方式进行开发,实现了几种常用的文件上传功能...
  4. java 合并 set_【Java必修课】各种集合类的合并(数组、List、Set、Map)
  5. 2019已过半,薪资相匹配除了实力,其实最重要的是……
  6. jvm性能调优 - 01类加载机制Review
  7. HLG2040二叉树遍历已知前中,求后
  8. 图像识别 标注(annotation)的反向优化策略
  9. boost::signals2模块实现定制组合器的测试程序
  10. Java 字符串,byte[],16进制的字符串互转
  11. python中的iter()函数与next()函数
  12. python+OpenCV图像处理(六)图像平滑与滤波
  13. linux5 vnc,CentOS 5 下安装配置VNC
  14. JavaScript学习笔记(八)--正则表达式
  15. kafka in action
  16. python界面-(八)Python 图形化界面设计
  17. element tree不刷新视图_架构蓝图软件架构 quot;4+1quot; 视图模型
  18. Windows 2000 安全检查清单( 摘自《网络与安全》)
  19. Salesforce随笔: 解决被指定给Chatter相关用户的RecordType无法被删除的问题
  20. 非此即彼的逻辑错误_GMAT高分范文100篇(非此即彼逻辑错误)【圣才出品】

热门文章

  1. maven自定义本地仓库目录
  2. android 动画xml属性总结
  3. Flash(as3.0) CScreen
  4. 添加源代码到你的sdk中
  5. 怎样去构建一个优质的Docker容器镜像
  6. 前端项目集成 stylelint
  7. Hibernate使用createSqlQuery进行模糊查询时找不到数据
  8. Matlab中的函数句柄@
  9. UVa 10935 - Throwing cards away I
  10. 文件那些事儿之一(初稿)