2 baidu 34513159 baidu_34513159 于 2016.04.25 13:17 提问

S3C2440裸机编程中汇编跳转到C函数失败

//my_main.c
#define GPFCON (*(volatile unsigned long )0x56000050)
#define GPFDAT (
(volatile unsigned long *)0x56000054)

#define GPF4_out (1<<(4*2))
#define GPF5_out (1<<(5*2))
#define GPF6_out (1<<(6*2))

void wait(volatile unsigned long dly)
{
for(; dly > 0; dly--);
}

int main(void)
{
unsigned long i = 0;

GPFCON = GPF4_out|GPF5_out|GPF6_out;        // 将LED1-3对应的GPF4/5/6三个引脚设为输出

while(1){
    wait(30000);
    GPFDAT = (~(i<<4));     // 根据i的值,点亮LED1-3

    if(++i == 8)
        i = 0;
}

return 0;

}

//start.s

.text
.global _start
_start:
ldr sp,=4096
bl disable_watchdog
bl set_sdram
bl init_nand
bl read_nand_to_sdram
ldr sp,=0x34000000
ldr lr,=loop
ldr pc,=main

loop:

b loop

//nand.lds

SECTIONS { 

firtst 0x00000000 : { head.o init.o nand.o}
second 0x30000000 : AT(4096) { my_main.o }
}

求教:为什么将wait函数改为内联函数,就能成功执行 ldr pc,=main
跳转到main中执行,
,如果不改,就跳转不到main中执行?

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
s3c2440的LED点灯裸机C程序
1.gcc编译的时候-g选项表示添加一些调试信息。 一个程序一般会经过(针对一个linux程序) (1)预处理 (2)编译:.c文件处理为.s文件 (3)汇编:.s文件处理为.o文件 (4)链接:把多个.o文件合并为一个可执行文件 2.nor flash不能像内存一样写数据,必须先擦除再写。 3.main函数被谁调用?main函数的返回值给谁了? 答:普通应用程序,main函数会被
S3C2440 汇编之地址跳转
S3C2440 汇编之地址跳转 2015-2-11 自己写了个IRQ的跳转处理,但是却发现BL指令编译通不过,BLX也不行。 后来才知道,S3C2440还是ARMv4的汇编指令体系结构,不支持BLX,而BL只支持跳转到常量地址。 形如BL R0的写法是不行的,而BX是可以的,BX是带模式切换的,不过模式不需要切换也一样可以用,但BX不能把下一个地址保存到LR中, 只有BL和BLX才可以,
S3C2440裸机实战 之一 创建初始工程
S3C2440裸机实战 之 创建初始工程 2015-2-3
s3c2440的LED点灯裸机汇编程序
1.s3c2440裸机LED点灯代码(汇编代码) .text .global _start _start:                 LDR     R0,=0x56000010      @ R0设为GPBCON寄存器。此寄存器                                         @ 用于选择端口B各引脚的功能:
keil4 进行 S3C2440裸机开发
用Keil-MDK开发TQ2440裸机程序入门教程——LED流水灯实现 觉得此编文章很详实,故转载之,来自http://www.amobbs.com/thread-5281512-1-1.html 开发板也差不多买了半年了, 以前照着教程用的是软件是ADS,在win7下老是崩溃, 后来才知道ADS早就不提供支持了, ADS的公司怎样怎样了...(此处省略300..) 然后我就捣鼓
S3C2440 中断程序
CPU 运行过程中,如何知道各类外设发生了某些不预期的事件,比如串口接收到了新数据、USB 接口中插入了设备、按下某个按键等。主要有以下两个方法:     查询方式:程序循环地查询各设备的状态并作出相应反应。它实现简单,常用在功能相对单一的系统中,比如在一个温控系统中可以使用查询方式不断检测温度的变化。确定是占用 CPU 资源过高,不适用于多任务系统。     中断方式:当某事件发生时,硬
让程序跳转到某绝对地址执行
先看如下程序: #include using namespace std; void fun() { cout } int main() {   typedef void(*func)(void);   func  Fun = fun;   (*fun)();//1    (*((void (*)( ))Fun )) ( );//2    return 0;
ARM9 S3C2440按键中断方式点亮LED的汇编程序
<br />GPFCON EQU 0x56000050<br />GPFDAT EQU 0x56000054<br />GPFUP  EQU 0x56000058<br />GPGCON EQU 0x56000060<br />GPGDAT EQU 0x56000064<br />GPGUP  EQU 0x56000068 <br /><br />SRCPND EQU 0X4A000000<br />INTMSK EQU 0X4A000008<br />INTPND EQU 0X4A000010<br />
汇编和C相互调用,keil环境,arm体系
C代码: #include extern void mystrcpy(char *s1,const char *s2); int main(void) { const char *string1="test example"; char *string2="xxxxxxxxxxxx"; mystrcpy(string2,string1); while(1)
朱老师ARM裸机学习笔记(七):汇编写启动代码之调用C语言
实验环境说明硬件平台:飞凌嵌入式OK210开发板(S5PV210) 说明:开发板已经刷入OK210原厂u-boot,本文程序直接下载进CPU iRAm中运行 软件平台:Ubuntu15.10 + arm-linux-gcc 4.4.3初始化栈1、C语言运行需要栈空间来存储临时变量和函数调用时的所占用的空间。我们在操作系统下写的应用程序以及其他一些单片机程序不需要设置栈是因为,操作系统或者单片机内