用uboot调试裸机C语言

发布者:Whisper123最新更新时间:2015-07-27 来源: 51hei关键字:uboot  调试裸机  C语言 手机看文章 扫描二维码
随时随地手机看文章
  昨天用uboot1.4调试了一下基于s3c44b0的一个LED灯实验,成功,纪录下:

  最初的设想是想用uboot的loadb命令来调试自己移植的uboot,发现串口没显示,当时就晕了 就不想再动了,原因可想而知是各种各样的,难~~~  但再想想是不是思路有问题,就打算写个裸C来试下loadb命令。

整个程序就是实现个流水灯(也就只有三个LED),就叫做led.c吧,编译成led.o,再用arm-elf-objcopy成led.bin,通过串口,用uboot命令loadb 0x0c008000 用超级终端传送一下,(很快,一下而过)发现板子没反应,(又晕了)只有找google了(还是推荐google,百度还是差点)发现还要链接,那就arm-elf-ld -Ttext 0x0c008000 -nostdinc -o led.elf led.o(不是很懂为什么要加-nostdinc 然道是为了帮ld省事,不要去找stdinc??)。再次loadb 发现板上的灯还是没动静()这可杂办呢~~~

再次使出google大法,再看看自己的led.c~~~~~(时间很长

终于找到了一点有用的:“对于裸机C程序,入口函数应该放在文件最前面”

然道我的灯不动就是因为在entry()之前写了一个delay()????

那就试着改一下吧,所有其他函数都写在entry()之后,再次arm-elf-gcc arm-elf-as arm-elf-ld arm-elf-objcopy~~(各种难啊~~)最后loadb 0x0c00800~~~~~~~

终于是见到板上的LED如程序所写一样的动起来了~~(激动啊

    激动之后再想想,觉的所谓的裸C程序,入口函数应该在文件最前面 这一点甚是不懂啊,再次请教google大叔,哎,发现有关的太少了,看样子是没多少人研究这个了~~~

突然想到arm-elf-readelf这个东西,还是用用吧,打开led.elf看看,于是在arm-elf-readelf -a led.elf作用下,显示了一大堆,当时就眼花了,怕了~~~

还是慢慢来吧,一步一步来,先arm-elf-readelf -h led.elf

还是能看懂的,非常简单的几个english word  再次arm-elf-readelf -s led.elf

感觉自己要的东西出现了~~~~

出现了类似表单的文本,不懂头几个单词的意思()却在下面发现了entry ~~

还在同一行看到了0c008000 应该是说在0x0c008000这个地方有一个entry 哈哈,这个我懂啊,所谓的程序入口函数嘛,我的程序就是要在0x0c008000处开始运行啊

于是我再改回我原来的led.c,把delay()放在entry()前面,再次arm-elf-readelf -s led.elf,发现

在0c00800 一行上对应的是 .gcc2_compiled  而entry这一行对应的地址却是0c00802c

哎,这才总算在猜测+测试中发现所谓的裸C程序入口函数为什么要放在最前面了(只是猜测没人告诉我why)裸C程序里的函数放置地址是按函数实现的地址来放置的 就是说在内存中函数的放置地址顺序与在文件中的实现顺序是对应的~~ 而非裸C程序,甚至只要加了个符号链接的话,在内存中的执行地址与程序文本中的实现地址是无关的~~

~~~由此牵扯出的一大堆问题怕是难以一下解决的了,哎  难~~~

   路漫漫其修远兮~~~~~~~

关键字:uboot  调试裸机  C语言 引用地址:用uboot调试裸机C语言

上一篇:uboot之relocate代码的深入理解
下一篇:分享一年的程序调试经验

推荐阅读最新更新时间:2024-03-16 14:26

单片机C语言程序设计: 单片机与 PC 通信
/* 名称:单片机与 PC 通信 说明:单片机可接收 PC 发 送的数字字符,按下单片机的 K1 键后,单片机可向 PC 发送 字符串。在 Proteus 环境下完成 本 实 验 时 , 需 要 安 装 Virtual Serial Port Driver 和串口调试助 手。本例缓冲 100 个数字字符, 缓冲满后新数字从前面开始存放(环形缓冲)。 */ #include reg51.h #define uchar unsigned char #define uint unsigned int uchar Receive_Buffer ; //接收缓冲 uchar Buf_Index=0; //
[单片机]
单片机<font color='red'>C语言</font>程序设计: 单片机与 PC 通信
Tiny4412之C语言实现流水灯,Tiny4412裸机程序[3]
在前边我们使用汇编完成了一个流水灯实验: Tiny4412汇编流水灯代码,Tiny4412裸机LED操作 ---- - -- -- -- - -- -- 修改: # ${MKBL2} ${SOURCE_FILE} bl2.bin 14336 ./${MKBL2} ${SOURCE_FILE} bl2.bin 14336 或者: MKBL2=my_mkbl2改成MKBL2=./my_mkbl2 必须有:chmod +x my_mkbl2 chmod 777 my_mkbl2 然后 查看下权限 ls -l my_mkbl2 变黄即可 后编译成功 r
[单片机]
Tiny4412之<font color='red'>C语言</font>实现流水灯,Tiny4412<font color='red'>裸机</font>程序[3]
单片机定时器中断原理和C语言代码详解
我之前都是用ARM7,单片机基本不会。但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。废话不说了,上代码。 #define _1231_C_ #include reg51.h #include 1231.h //sbit OE=P2^3; unsigned int SystemTime; void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑 { TH0 = 0xdb; TL0 = 0xff; // TF0 = 0; SystemTime++; } void m
[单片机]
PIC18f4520单片机驱动H1632的C语言程序
#include p18f4520.h #include delays.h //#pragma config OSC = HS //配置内部振荡器Fosc/4 RA7,IO口RA7 //#pragma config PWRT =OFF //#pragma config BOREN = OFF //#pragma config WDT = OFF //#pragma config MCLRE = ON //#pragma config PBADEN = OFF //#pragma config LVP = OFF #define CLK PORTCbits.RC3 #define DAT PORTCbits.RC5 #define
[单片机]
PIC18f4520单片机驱动H1632的<font color='red'>C语言</font>程序
基于51的EEPROM C语言程序
#include reg52.h //单片机51头文件,存放着单片机的寄存器 #include intrins.h #define uchar unsigned char #define uint unsigned int uchar code tab = 0123456789 ; sbit SID=P2^0; //数据信号 sbit SCLK=P2^1; //时钟信号 uint tcnt; //定时中断次数 bit write=0; //写24C08的标志; sbit scl=P3^7; //24c08 SCL sbit sda=P3^6; //24c08 SDA uchar a,
[单片机]
STC51入门笔记(郭天祥C语言)---第五节:A/D和D/A工作原理
一、模拟量与数字量概述: 如温度、压力、位移、图像等都是模拟量,电子线路中模拟量通常包括模拟电压和模拟电流,生活用电220V交流正弦波就属于模拟电压,随着负载大小的变化,其电流大小也跟着变化,这里的电流信号也属于模拟电流,图5.1.1和图5.1.2所表示的信号就属于模拟量。 像图5.1.1和图5.1.2所示信号的幅值随着时间变化而连续变化的量就是模拟量,模拟量有可能是标准的正弦波,有可能是不规则的任何波形,也有可能是规则的方波、三角波等,当我们用数值表示其大小时,通常用十进制数表示,如2.3V,5A,47N等。 单片机系统内部运算时用的全部是数字量,即0和1,因此对单片机系统而言,我们无法直接操作模拟量,必须
[单片机]
STC51入门笔记(郭天祥<font color='red'>C语言</font>)---第五节:A/D和D/A工作原理
C语言写一个驱动数码管程序
/****** 本程序功能说明 *****用STC的MCU的IO方式控制74HC595驱动8位数码管。显示效果为: 数码时钟。使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.*****/ #define MAIN_Fosc 22118400L //定义主时钟 #include STC15Fxxxx.H #define Timer0_Reload (65536UL -(MAIN_Fosc / 1000)) //Timer 0 中断频率, 1000次/秒 #define DIS_DOT 0x20 #define DIS_BLACK 0x10 #define DI
[单片机]
C语言编程操作SPMC75内部Flash的方法
1 引言   支持C语言几乎是所有微控制器程序设计的一项基本要求,当然SPMC75系列单片机也不例外。μ'nSPTM 指令结构的设计就着重考虑对C语言的支持,GCC就是一种针对μ'nSPTM 操作平台的ANSI-C编译器。但是在应用中对于程序的设计,特别是C和ASM混合使用的时候有些地方是需要注意的,在C中如何嵌入ASM也是一个不可回避的问题。 2 SPMC75单片机FLASH硬件资源分析   SPMC75系列微控制器Flash分为两区:信息区和通用区,在同一时间只能访问其中的一区。信息区包含64个字,寻址空间为0x8000 ~ 0x803F。地址0x8000为系统选项寄存器P_System_Option。其他地址空间可由用户自
[单片机]
用<font color='red'>C语言</font>编程操作SPMC75内部Flash的方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved