安装ARM调试器
摘要:一、概述 1、调试ARM应用程序的软硬件组成 硬件JTAG/SWD仿真器 Eclipse调试插件 GDB调试客户端 GDB服务器端 JTAG/SWD需要的硬件驱动 2、GNU ARM Eclipse推荐的两种调试方案 SEGGER J-Link仿真器 & GDB server是一种非常高效的解决方案
阅读全文
posted @
2014-07-01 11:13
amanlikethis
阅读(1202)
推荐(0) 编辑
windows下STM32开发环境的搭建
摘要:一、概述 1、说明 笔者已经写了一篇Linux下STM32开发环境的搭建 ,这两篇文章的最区别在于开发环境所处的系统平台不一样,而其实这个区别对于开发环境的搭建其实影响不大,制作局部上的操作上发生了改变。鉴于此,本文没有必要对windows下搭建STM32开发环境的详细过程进行阐述,读者可以结合Li
阅读全文
posted @
2014-06-30 16:13
amanlikethis
阅读(5379)
推荐(0) 编辑
GCC交叉编译链命名
摘要:命名格式:arch[-vendor][-os]-abiarch:CPU的架构vendor:工具链的供应商os: 目标上运行的操作系统,不同的操作系统对应着不同的C库,例如newlib、glibc,、crt0等等。在程序的连接阶段将连接这些不同的C库。abi: 指定应用程序的二级制文件接口规定,确保不...
阅读全文
posted @
2014-06-27 11:36
amanlikethis
阅读(609)
推荐(0) 编辑
Linux下STM32开发环境的搭建
摘要:目录 一、概述 1.目的 2、开发环境描述 3、Eclipse构建的STM32集成开发环境结构 4、GDB / GDB Server 调试模型 二、搭建步骤 三、详细的搭建过程 1、安装eclipse IDE for C/C++ developers 2、安装交叉编译链arm-none-eabi-g
阅读全文
posted @
2014-06-23 11:51
amanlikethis
阅读(53343)
推荐(1) 编辑
Warning File `.depend' has modification time 1.6 s in the future
摘要:一、前提知识 主机时间与虚拟机时间不同步所致。我们在某一操作系统所属磁盘空间下创建一个文件,那么这个文件的创建时间是以磁盘所属的操作系统的时钟为基准的。 我们假设主机windows的系统时间是10:00,但是虚拟机linux系统的时间是9:00。c:/work是主机通过VMware Tools共...
阅读全文
posted @
2014-04-15 09:21
amanlikethis
阅读(2232)
推荐(0) 编辑
APCS
摘要:arm汇编程序中,R0,R1,R2,R3,R12都是作为中间寄存器,而R4-R11是不能随便使用的,暂时我还不知它们的用途。所以,中间寄存器,在程序运行的开始处与结束的时候值是可以不一样的,也就是说中间寄存器只起到中间的保存作用,所以没必要全局保存。 但是用C语言写的函数可以看到R4-R11在开始处与结束处的值是一样的。倘若C语言的函数中用到了中间变量太多,需要用到R4-R11中的某几个,这时它会在进入函数时把用到的寄存器保存到堆栈中,在结束的时候弹出。 中断程序与普通的函数不一样。中断程序的断点是不确定的,这个时候需要将中间寄存器也保存起来,这样才能在回到断点后能继续正常执行。
阅读全文
posted @
2014-03-19 11:21
amanlikethis
阅读(294)
推荐(0) 编辑
__attribute__ ((section(".text")))的测试
摘要:一、测试原因 在学习u-boot的环境变量过程中,看到有如此的代码,现对涉及到的内容进行实验测试。二、测试目的1、了解gcc允许对段的属性进行更改的方法。2、解决”ENV_IS_EMBEDDED“解惑以及相关的移植实验中如何将环境变量(结构体变量environment)定位在代码段的0x33f84000的位置,以实现环境变量区嵌入到代码段的功能。三、测试原理(参考attribute 用法 section 部分) gcc通过选项__attribute__可以改变所声明或定义的函数、数据的特性。它有很多子项,用于改变作用对象的特性。比如对函数,noline将禁止进行内联扩展、noreturn...
阅读全文
posted @
2014-01-14 10:49
amanlikethis
阅读(9808)
推荐(1) 编辑
测试gcc的优化选项
摘要:一、测试准备及原理测试代码:static void wait(volatile unsigned long dly){ for(; dly > 0; dly--);}int main(void){ unsigned long i = 0; // LED1,LED2,LED3,LED4对应的4根引脚设为输出 GPBCON = GPB5_out | GPB6_out | GPB7_out | GPB8_out; while(1){ wait(30000); GPBDAT = (~(i<<5)); // 根据i的值,点...
阅读全文
posted @
2014-01-10 20:04
amanlikethis
阅读(576)
推荐(0) 编辑
gcc常用的编译选项
摘要:一、程序编译过程 程序编译的时候,要分四个阶段 :1、预处理阶段,完成宏定义和include文件展开等工作;2、根据编译参数进行不同程度的优化,编译成汇编代码;3、用汇编器把汇编代码进一步生成目标代码;4、用连接器把生成的目标代码和系统或用户提供的库连接起来,生成可执行文件;二、gcc/g++的编译过程1.预处理,不生成文件 [预处理器cpp] 2.将预处理后的文件转换成汇编语言,生成.s的文件 [编译器egcs] 3.由汇编变为目标代码(机器代码)生成.o的文件 [汇编器as] 4.连接目标代码,生成可执行程序 [链接器ld] 三、gcc常用编译选项-E只运行C预编译器cpp,不生成文件..
阅读全文
posted @
2014-01-10 19:19
amanlikethis
阅读(631)
推荐(0) 编辑
arm-linux-gcc编译器定义寄存器变量
摘要:uboot代码中有这么一句话“#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")”,困扰了山人多时。经过多番求索,才得知原来是定义了一个全局的寄存器变量gd_t(r8是它的专用寄存器)。 详细解释一下,...
阅读全文
posted @
2013-11-25 16:42
amanlikethis
阅读(2877)
推荐(0) 编辑
gcc向待编译源文件传入参数的方法
摘要:gcc有两种方法向待编译源文件传入参数第一种 利用–Dmacro=name 编译选项,详见gcc -D选项第二种 利用链接脚本(*.lds)传入参数,类似于ADS的编译器参数可以被待编译源文件调用举例:SECTIONS { . = 0x00000000; .init : AT(0){ head.o init.o nand.o} . = 0x30000000; .text : AT(4096) { *(.text) } .rodata ALIGN(4) : AT((LOADADDR(.text)+SIZEOF(.text)+3)&~(0x03)) {*(.rodat...
阅读全文
posted @
2013-11-15 15:53
amanlikethis
阅读(1257)
推荐(0) 编辑
gcc -D选项
摘要:一、概念 gcc的-D选项可以定义宏,这是什么意思呢? C语言源程序中有#define定义的宏,可以起到替换、条件编译的功能;定义宏的方式是放在头文件或者C文件中。gcc提供了另外一种宏定义的方法,当然可以想象这样的宏定义方法并不是很好用,但毕竟编译器给我们提供了额外的宏定义的方法。假设程序需要很多宏,不可能这些宏都在编译器中定义,可以说比较重要的宏才会放在gcc的D选项后边。-Dname 定义宏name,默认定义内容为字符串“1”-Dname=defn 定义宏name,并且内容为defn二、实验测试程序:#include int main(){ #ifdef HELLO prin...
阅读全文
posted @
2013-11-14 19:16
amanlikethis
阅读(8957)
推荐(2) 编辑
bss段为什么需要初始化?
摘要:我们都知道bss段需要初始化,但是这是为什么呢? 通过浏览资料,我们都会发现,bss段是不会出现在程序下载文件(*.bin *.hex)中的,因为全都是0。如果把它们出现在程序下载文件中,会增加程序下载文件的大小。实际应用中,通常只需要把bss段的起始地址和结束地址保存起来,而不需要将程序下载文件中出现bss段(一堆0)将来真正运行程序的时候,再根据这两个数据进行bss段的初始化就行了。 以上这段文字是网上的资料说的。但是,我可不可以让bss段出现在程序下载文件中呢?如果这样可以的话,当程序由存储器(例如nandflash)拷贝到内存中时,捎带着会把bss段像data段那样初始化。 实际上是.
阅读全文
posted @
2013-10-23 18:45
amanlikethis
阅读(2497)
推荐(0) 编辑
ARM GCC 内嵌汇编手册
摘要:转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.htmlARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方便各位业界同仁而翻译,方便大家开发底层代码使用,转载请注明出处,谢谢。要是你E文功底好,本人还是建议阅读E文版的。http://www.ethernut.de/en/documents/arm-inline-asm.html 对于基于ARM的RISC处理器,GNU C编译器提供了在C代码中内嵌汇编的功能。这种非常酷的特性提供了C代码没有的功能,比如手动优化软件关键部分的代码、使用相关的处理器指令。这
阅读全文
posted @
2013-10-23 18:10
amanlikethis
阅读(3411)
推荐(0) 编辑
警惕arm-linux-gcc编译器优化选项
摘要:arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高。但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的。有时候,我们需要事物差的一面。下边的代码是我的main.c程序。#defineGPBCON(*(volatileunsignedlong*)0x56000010)#defineGPBDAT(*(volatileunsignedlong*)0x56000014)#defineGPB5_out(10;dly--);}intmain(void){unsignedlongi=0;GPBCON=GPB5.
阅读全文
posted @
2013-10-13 21:49
amanlikethis
阅读(2347)
推荐(0) 编辑
gcc编译器
摘要:gcc/g++在执行编译的时候,只要分四个阶段 :1、预处理阶段,完成宏定义和include文件展开等工作; [预处理器cpp] 2、根据编译参数进行不同程度的优化,编译成汇编代码,生成.s的文件; [编译器egcs]3、用汇编器把汇编代码进一步生成目标代...
阅读全文
posted @
2013-09-28 20:29
amanlikethis
阅读(272)
推荐(0) 编辑
arm-linux-gcc中对“inline”的处理
摘要:C++对于关键字“inline”的处理大家都知道,C++编译器对于内敛函数就是把它当做一个宏展开。这样可能会增加程序的代码量,却可以减少程序入栈和出栈的此处,从而影响程序的执行速度。但是,C语言中扩展了C++的这个关键字,不同的编译器对它的处理还不一样。ADS的C编译器对“inline”还不支持,而本文主要谈arm-linux-gcc对“inline”的处理。 下边是对“arm-linux-gcc的C编译器对 inline处理”的测试。无关键字的程序inline的程序代码:staticvoidwait(volatileunsignedlongdly){for(;dly>0;dly--);
阅读全文
posted @
2013-09-28 19:23
amanlikethis
阅读(1640)
推荐(0) 编辑
链接脚本分析
摘要:链接三要素:链接顺序,链接地址,加载地址1.连接顺序的问题 倘若没有链接脚本,例如:arm-linux-ld –Ttext 0x00000000 -o nand_elf
,那么链接顺序就是^的顺序,即makefile中依赖的顺序。 倘若有链接脚本,则会按照链接脚本的规则进行链接。例如:SECTIONS { firtst 0x00000000 : {head.o init.o nand.o} second x30000000 : AT(4096){ main.o}} 这个规则中定义了两个大段,first和second。first的链接顺序为head.o init.o nand.o. ...
阅读全文
posted @
2013-09-28 18:25
amanlikethis
阅读(1616)
推荐(0) 编辑
arm-linux-gcc编译器测试
摘要:1、#include <>与#include ""的区别 #include <>只在标准库中搜索头文件,而#include ""首先在用户工作目录(指的是当前被编译源文件所在目录)搜索,搜索不到再到标准库中搜索头文件(注意其他目录是不会搜索的)。也就是说#include ""搜索的范围比#inclu
阅读全文
posted @
2013-09-24 15:32
amanlikethis
阅读(1018)
推荐(0) 编辑