本帖最后由 yuanlai2010 于 2014-7-14 08:20 编辑
关狗&调用C函数
参与Helper2416开发板助学计划心得
07-14 应网友要求 已附上源码包 欢迎下载
直接make就行了
看门狗背景简介:
看门狗的作用在于监控CPU的运行,保证在诸如噪音和系统错误等这样的故障干扰情况下能尽快恢复正常工作。看门狗与PWM定时器都能实现定时的功能,两者的区别在于看门狗能发出复位信号而PWM定时器不能,后面将会有具体的章节讲解看门狗的定时和复位功能,这里我们只是简单的将其关闭。
程序源码即讲解:
led_blink.S
- @******************************************************************************
- @ File:led_blink.S
- @ 功能:关闭看门狗,跳转到C函数
- @******************************************************************************
- .text
- .global _start
- _start:
- LDR R0, =0x53000000 @关闭看门狗
- MOV R1, #0x00
- STR R1, [R0]
-
- LDR R0, =0x56000010 @ 把GPB1配置为输出模式
- MOV R1, #0x00000004
- STR R1, [R0]
- MAIN_LOOP:
- LDR R0, =0x56000014 @ GPB1输出低点亮LED
- MOV R1, #0x00000000
- STR R1, [R0]
-
- MOV R0, #0x400 @用R0传递参数
- BL delay @跳转到C函数:延时
-
- LDR R0, =0x56000014 @ GPB1输出高熄灭LED
- MOV R1, #0x00000002
- STR R1, [R0]
-
- MOV R0, #0x400 @用R0传递参数
- BL delay @跳转到C函数:延时
- B MAIN_LOOP @不断循环
-
- .end
-
复制代码 1:用汇编手动关闭了看门狗。
2:调用C函数实现延时功能,这里并没有手动设置堆栈,目的在于测试IROM有没有帮我们设置好栈。
delay.c
- void delay(unsigned int time)
- {
- unsigned int i=0,j=0;
- for(i=0;i<time;i++)
- {
- for(j=0;j<1000;j++);
- }
- }
复制代码 *:汇编调用C函数时,当参数个数不超过4个,使用r0~r3这4个寄存器来传递参数;如果参数个数超过4个,剩余的参数通过栈来传递,delay()只有1个参数,所以用r0来传递。
编译代码及烧写:
这里还是附上连接脚本和Makefile吧!
link.lds
- MEMORY
- {
- IRAM_MEM : o = 0x40000000, l = 0x1FFF /* 8k internal Memory */
- }
- OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
- OUTPUT_ARCH(arm)
- SECTIONS
- {
- .start :
- {
- . = ALIGN(4);
- led_blink.o (.text)
- } >IRAM_MEM
-
- .text :
- {
- . = ALIGN(4);
- *(.text*)
- *(.rodata*)
- } >IRAM_MEM
- .data :
- {
- . = ALIGN(4);
- *(.data*)
- } >IRAM_MEM
- .bss :
- {
- . = ALIGN(4);
- *(.bss*)
- *(COMMON)
- } >IRAM_MEM
- }
复制代码 Makefile:
- led_blink.bin :led_blink.o delay.o
- arm-linux-ld -Tlink.lds -o led_blink.elf $^
- arm-linux-objdump -D led_blink.elf > led_blink_elf.dis
- arm-linux-objcopy -O binary -S led_blink.elf led_blink.bin
- gcc mk2416sdbin.c -o mk2416sdbin
- ./mk2416sdbin led_blink.bin app.bin
- %.o : %.S
- arm-linux-gcc -o $@ [ DISCUZ_CODE_3 ]lt; -c
- %.o : %.c
- arm-linux-gcc -o $@ [ DISCUZ_CODE_3 ]lt; -c
-
- clean:
- rm -f mk2416sdbin led_blink.elf led_blink_elf.dis *.bin *.o
复制代码 其中mk2416sdbin的作用是制作可以在SD启动的bin文件,源码在之前的帖子中:
编译:直接cd到工程目录后make即可
烧写:用IROM_Fusing_Tool直接烧写app.bin到SD卡即可
运行效果及结论:
效果:LED成功闪烁起来
结论:IROM已初始化栈
论坛ID:yuanlai2010
发表时间:2014-07-13