OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9313|回复: 5

无条件转移

[复制链接]

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2011-8-30
在线时间
7 小时
发表于 2011-11-4 12:55:42 | 显示全部楼层 |阅读模式

请问一下:C语音能否完成一个无条件转移要求,
我学要的是从一个字函数无条件转移到另外一个子函数,而现在的GOTO 只能在同一个子涵数里面进行无条件转移,
请问有没有别的方法;
或则能否直接操作R13(SP)、R14(LR)、R15(PC);现在的好像不能直接操作它们,都是没有被定义过。。。。
求解????

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-4 13:57:25 | 显示全部楼层
回复【楼主位】 周日党 :
---------------------------------
调用另外一个函数,不就转移过去了么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2011-8-30
在线时间
7 小时
 楼主| 发表于 2011-11-4 14:12:48 | 显示全部楼层
这个转移时无条件转移,而且使任意的地址的,假如调用另外一个函数的话也就只能到该函数的入口地址去了。这样也就是一个确定的地址了。

我还想问一下,进入中断和退出中断过程中压栈和出栈对数据和地址的存取过程是怎样的?????
回复 支持 反对

使用道具 举报

11

主题

81

帖子

0

精华

初级会员

Rank: 2

积分
145
金钱
145
注册时间
2011-9-4
在线时间
0 小时
发表于 2011-11-4 15:54:14 | 显示全部楼层
写程序时尽量不要使用GOTO类的无条件转移,它会使程序的可读性和程序的维护性变差,并且使程序跑飞的隐患大大增加,在程序中可使用条件判断来代替无条件转移,即使是使用无条件转移也只在一个函数内使用,不要从一个函数跳到另外一个函数。
回复 支持 反对

使用道具 举报

12

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2011-8-30
在线时间
7 小时
 楼主| 发表于 2011-11-4 16:06:17 | 显示全部楼层
我想问一下堆栈指针SP寄存器的地址是多少?????
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2011-11-4 16:50:52 | 显示全部楼层
回复【5楼】周日党:
---------------------------------
看ucos就知道了.
/******************************************************************************
** 函数名称: OSTaskStkInit
** 功能描述: 任务堆栈初始化代码,本函数调用失败会使系统崩溃
** 输 入: task: 任务开始执行的地址
**         pdata :传递给任务的参数
**         ptos  :任务的堆栈开始位置
**         opt   :附加参数,当前版本对于本函数无用,具体意义参见OSTaskCreateExt()的opt参数
** 输 出: 栈顶指针位置
** 全局变量:
** 调用模块: 

******************************************************************************/

OS_STK *OSTaskStkInit (void  (*task)(void  *parg), void  *parg, OS_STK  *ptos, INT16U  opt)
{
    OS_STK *stk;


    (void)opt;                                        /*  'opt' is not used, prevent  */
                                                      /*  warning 没有用'opt',       */
                                                      /*  防止编译警告                */
                                                                            
    stk = ptos;                                       /*  Load stack pointer          */
                                                      /*  装载堆栈指针                */                                    

                                                      /*  Registers stacked as if     */
                                                      /*  auto-saved on exception     */             
                                                  /*  模拟成异常,自动把寄存器压栈*/

    *(stk) = (INT32U)0x01000000L;                     /*  xPSR                        */ 
    *(--stk) = (INT32U)task;                          /*  Entry oint of the task     */
                                                      /*  任务入口地址                */
    *(--stk) = (INT32U)0xFFFFFFFEL;                   /*  R14 (LR)  (init value will  */
                                                      /*  cause fault if ever used)   */
                                                                           
    *(--stk) = (INT32U)0x12121212L;                   /*  R12                         */
    *(--stk) = (INT32U)0x03030303L;                   /*  R3                          */
    *(--stk) = (INT32U)0x02020202L;                   /*  R2                          */
    *(--stk) = (INT32U)0x01010101L;                   /*  R1                          */
    *(--stk) = (INT32U)parg;                          /*  R0: argument  输入参数     */
                                                      /*  Remaining registers saved on*/
                                                      /*  process stack               */   
                                                  /*  剩下的寄存器保存到堆栈      */

    *(--stk) = (INT32U)0x11111111L;                   /*  R11                         */
    *(--stk) = (INT32U)0x10101010L;                   /*  R10                         */
    *(--stk) = (INT32U)0x09090909L;                   /*  R9                          */
    *(--stk) = (INT32U)0x08080808L;                   /*  R8                          */
    *(--stk) = (INT32U)0x07070707L;                   /*  R7                          */
    *(--stk) = (INT32U)0x06060606L;                   /*  R6                          */
    *(--stk) = (INT32U)0x05050505L;                   /*  R5                          */
    *(--stk) = (INT32U)0x04040404L;                   /*  R4                          */

    return(stk);
}
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-24 10:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表