Learn lumit Step 1: ARM 程序开发技巧
Learn lumit Step 1 : ARM 程序开发技巧 make & makefile++++++++++++++++++++++++++++++++++++++++++++++++++++++
很多习惯了在 Linux 下敲 make 命令编译一个项目工程或者 Linux 内核源码的开发者,
在 Windows 平台上使用 IDE 集成开发环境配合鼠标点击进行开发工作时,常常会觉得很慢。
我不知道大家的编程习惯是否这样,不过做嵌入式软件开发的一个特点就是调试的工作比较
麻烦,有时候直接把代码放到板子上跑一遍看看 printf 出来的结果就能在相当程度上替代
设置断点和观察变量来进行调试。
在 Windows 上开发 ARM 的程序,大多数人使用的是 SDT 或者 ADS 。当然这两个都是
ARM 公司出的,ADS 出来之后,用 SDT 的人就慢慢少了,原来在 SDT 上配合调试的一些小
工具也逐步开始有了 ADS 上的替代者,这个变化相信这几年做 ARM 开发的都有体会。
在转到 ARM 平台上做嵌入式开发之前,我有很长一段时期都是在 linux 上写程序,给
实验室那个笨重的机器人平台调试驱动。习惯了在 linux 下敲 make 命令,转到 ADS 上做
开发时就很不习惯,主要是对 IDE 不太熟,编译参数设置起来感觉麻烦。另外,长时间的
调试驱动带来的“后遗症”,变得只会用 printk 来调试。实验室当时花了近2万块钱专门
买的 Multi-ICE 几乎没怎么用,一直被丢在角落里,被很多人看到说是“暴殄天物”。
我想在 Windows 上找一个类似 make 的工具,后来发现安装 VC 后有一个 NMAKE.EXE,
这个命令和 make 很像,这里我也推荐和我有同感的朋友使用。我把它放到 lumit 网站上,
在 资料下载 -> 开发工具 里面,大家直接下载后改个名字叫 make.exe 就可以用。
对于 linux 下 make 命令不太熟悉的朋友,我介绍一个简单的例子,一看就明白了。
#
# makefile-test led program and show how to use makefile
#
# Author: li ming <[email protected]>
# Date: 2005-5-20
# Copyleft: http://www.lumit.org
#
#************************************************************
# display a hint of how to make first target
all:
@echo Hint: you can type "make l0" to build first target
#************************************************************
#compile and link led_0000.s, then convert .axf -> .bin file
l0:
armasm led_0000.s -o led_0000.o
armlink -ro-base 0x0 -entry 0x0 led_0000.o -o led_0000.axf
fromelf led_0000.axf -bin -output led_0000.bin
#************************************************************
# burn led_0000.bin into flash
j0:
-sjf4510-1.1.0.exe led_0000.bin
#************************************************************
# clean up all temp file except source file
clean:
rm -f *.o
rm -f *.axf
rm -f *.bin
上面的例子是从附件中 Makefile 中摘取出来的一个部分,一共可以做
四件事情: 即 make (all), make l0, make j0, make clean 这四个目标。
# 开头的行都是注释,@ 开头的命令不显示,- 开头的命令忽略错误继续执行。
这些概念和符号都和 linux 是类似的,下面是具体执行的一个例子输出。
( 在执行前,需要安装好 ADS 1.2 保证可以执行 armasm.exe, armlink.exe 和 fromelf.exe )
D:\lumit\Learn-lumit-Step-by-Step\Learn-lumit-Step-1>make
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
Hint: you can type "make l0" to build first target
D:\lumit\Learn-lumit-Step-by-Step\Learn-lumit-Step-1>make l0
Microsoft (R) Program Maintenance Utility Version 6.00.8168.0
Copyright (C) Microsoft Corp 1988-1998. All rights reserved.
armasm led_0000.s -o led_0000.o
armlink -ro-base 0x0 -entry 0x0 led_0000.o -o led_0000.axf
fromelf led_0000.axf -bin -output led_0000.bin
D:\lumit\Learn-lumit-Step-by-Step\Learn-lumit-Step-1>
在开始对 lumit 网站上提供的代码做更多分析之前,特别地把其中 make 和 makefile
的由来介绍一下,这样大家看到后面那些没有 ADS 项目工程文件 *.mcp ,只有 makefile 的
例子时就不会太奇怪了。 长见识了 也可以使用cygwin的make嘛。:) en,原来也考虑过 cygwin 下的 make ,但是还是觉得 nmake 方便简单一些,只需要一个文件哦:roll: 附件里的learn-lumit-step-1是什么呀!我打开后是乱码!
我执行make,不行呀!!! 附件好像有问题呀!!!!!!!!!!
附件好像有问题呀!!!!!!!!!!
附件好像有问题呀!!!!!!!!!!
附件好像有问题呀!!!!!!!!!!
附件好像有问题呀!!!!!!!!!! 是个 zip 文件,好像上传之后把后缀名去掉了。 你改成 learn-lumit-step-1.zip 再解压一次试试。 好了,谢谢!! 斑竹:
我现在正在看第一个实验,想把这个程序吃透,可是对硬件不熟.想请教你以下代码:
---------------------------------------------------
AREA LED, CODE
ldr r0, =0x03FF5000
ldr r1, =0x0003FFFF ; set all 18 gpios' direction to output
str r1,
---------------------------------------------------
(1)请问以上代码中AREA LED, CODE是什么意思?
(2)0x03FF5000这个地址是什么地址?
谢谢!!!:? 斑竹:
我查了ARM手册,AREA是个标识符.AREA LED, CODE表示LED代码段的声明,到END表示结束.
而第二个问题,依据你在step 2所写,0x03FF5000表示S3C4510B 内部 IO 端口模式寄存器 IOPMOD,0x03FF5008表示S3C4510B 内部 IO 端口数据寄存器 IOPDATA.
但是我查了um_s3c4510b_rev1.pdf 中的 Page 12-2 ~ 12-5,只是说IOPMOD和IOPDATA的偏移值offset分别是0x5000,0x5008,而reset value 分别是0x00000000和undefined value.请斑竹解释一下?
谢谢!!!!!!!! :? 斑竹:
我查了ARM手册,AREA是个标识符.AREA LED, CODE表示LED代码段的声明,到END表示结束.
而第二个问题,依据你在step 2所写,0x03FF5000表示S3C4510B 内部 IO 端口模式寄存器 IOPMOD,0x03FF5008表示S3C4510B 内部 IO 端口数据寄存器 IOPDATA.
但是我查了um_s3c4510b_rev1.pdf 中的 Page 12-2 ~ 12-5,只是说IOPMOD和IOPDATA的偏移值offset分别是0x5000,0x5008,而reset value 分别是0x00000000和undefined value.请斑竹解释一下?
谢谢!!!!!!!! :?
那是因為Special Function Register的起始位址為0X3FF0000,
依照不同的register加上不同的Offset即可存取該register。 谢谢楼上的指点,但是我在um_s3c4510b_rev1.pdf 的4-5中看到Special Function Register的起始位址為0X3FF8000,why???
请指点迷津!!!
:? 谢谢楼上的指点,但是我在um_s3c4510b_rev1.pdf 的4-5中看到Special Function Register的起始位址為0X3FF8000,why???
请指点迷津!!!
:?
在4-21頁有提到....
a reset initialize the start address to 3FF0000H. The offset address of the ROMCON
register is 3014H. Therefore, the physical address for ROMCON is 3FF0000H + 3014h = 3FF3014H. If you then
modified the start address of the special register area to 3000000H, the new address for the ROMCON register
would be 3003014H.
也就是說after reset 後SFR的base 為0x3ff0000,而你也可以改變SFR base。
--
台灣是好地方,大家有空來玩喔! :o
-- 台湾朋友也来啦,欢迎欢迎。。。:lol:
同意,0x3FF0000 是关于 S3C4510 的一个比较重要的地址。 Thanks to 台湾朋友linux08x和斑竹,以后我将继续在每个learn lumit step下发帖,请多多指教!!! :-)
页:
[1]
2