jz2440和mini2440 裸跑程序是否有意义看

查看: 784|回复: 1
学习嵌入式Linux-JZ2440-裸机程序总结
主题帖子精华
中级会员, 积分 204, 距离下一级还需 296 积分
在线时间1 小时
& & & 学习嵌入式有两三个礼拜了,其实进度一般,一直停留在裸机阶段(既要上班实习,又要回到学校偶尔帮老师做做事,自己还要找时间学这个),以前有学过的同学告诉我,做那么几个裸机就可以跳过它了,然后去搞移植,搞驱动。我本来也是这么考虑的,但是最后还是没这么做,因为我觉着后面搞驱动对一些概念性的东西还是需要懂的,而讲裸机的时候正好可以学习一下。
& && & 其实裸机程序就是在搞单片机程序,没有什么区别。以前基本上都是在Keil下编程,先建立工程,选择芯片型号,然后添加启动代码,之后编写代码文件,最后编译,下载验证。而搞ARM裸机程序也是一样的,一开始没有进行选型,在Keil下面选型其实就是确定一个配置信息,告诉IDE可用的资源有哪些等等。而搞ARM裸机不需要的原因是因为需要知道关于芯片型号的不是IDE,而是程序员自己,自己要知道有什么资源可以用,寄存器的地址又是什么,怎么去操作,都要自己动手去写,这也是ARM裸机程序的难点所在。我是没有使用IDE的,因为我觉着这样亲力亲为可以学习到很多东西,而且对于程序的组织结构、运行顺序等等基本概念的理解有非常大的作用,而且对gcc的学习、对makefile的学习等等都可以对后续的学习打下坚实的基础。所以,我还是建议老老实实的自己去搞一下,如果非坚持去使用IDE做的话,那真心可以直接跳过裸机程序,因为那样将和开发单片机程序没啥区别了。
& && &貌似在程序界,用来搞应用程序的时候一般第一个入门程序就会是Hello world程序,即打印一句Hello World。而搞单片机或者控制器程序,第一个程序一般都是操作GPIO点亮一个LED、识别按键。这些程序的代码量小但是程序结构完整,非常适合作为入门程序,让初学者对整个开发流程有完整的认识,同时学习到最基础的寄存器操作。记得当时学习51的时候,自己点亮第一个LED,后面又改成LED闪烁,再后面改成流水灯,再后面改成LED控制流水灯的快慢和方向…………就这样一点点的学习成长起来,后来搞MSP430应该说是最难的入手了,就拿着一块TI的小红板,然后对着User Guide,英文的哦,当时那个被虐的啊,真叫一个惨啊…………再后来老师让我学习STM32,虽说是ARM内核的,但是还是M内核的,偏向控制领域,STM32一搞就是两三年。接触ARM是在大四的时候才开始,之后又放下了。前阵子才又重新开始。搞第一个GPIO的时候还是挺顺利的,包括后面的,都得益于以前的单片机开发经验,学习了一些IDE编写头文件的方式,以及Project组织结构,在韦东山老师代码的基础上都做了自己的改动,能写成.h的就写一个.h和与之配套的.c,代码风格基本上延续了STM32时期从正点原子那里学到的东西。
搞裸机程序可以对硬件有一定的了解,也许对以后的移植会有帮助,我是这么认为的。下面的部分就到了移植UBoot,移植Linux两个大块了,看起来都是难啃的骨头,不过学习这个东西急躁不得,时间紧就更得慢慢来了,走马观花学不到什么东西,只是把视频看一遍,然后看看书,那样没太大的作用,就得自己多折腾折腾,折腾出来问题了,然后解决问题,在这个过程中自己慢慢的就进步了。
相信自己,加油!向更高层进发!
主题帖子精华
在线时间255 小时
不错啊,楼主的经验很宝贵啊。
我的淘宝小店:
Powered by学习嵌入式Linux-JZ2440-第一个裸机程序GPIO - ARM技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
学习嵌入式Linux-JZ2440-第一个裸机程序GPIO
20:08:58  
& && &&&ARM的裸机程序其实没什么特殊的,和单片机程序是一样的,我之前用过STM32,是ARM Cortex-M系列的。现在的ARM主要分三个,一个Crtex-M,主要用于控制。一个Cortex-A,主要用于应用,比如手机还有一些手持式设备。一个Cortex-R,嵌入式实时处理器,用于对实时性要求比较高的场合。& && && &现在开发ARM程序是在Linux下面进行的,没有用IDE,所以所有的事情都要自己做,但是这样的好处就是对整个程序的结构以及运行的理解有非常大的帮助,起码让我对Program有了新的认识。& && && &遇到的第一个难题就是启动代码,就是上电后运行的程序。因为这是一个简单的IO操作的程序,所以启动代码非常的简单。首先要学习的就是一点点汇编的知识,起码能够看得懂吧,不然就算抄也不知道代码用来做什么的。首先要清楚的就是汇编语音不是通用的,不用的处理器用的是不一样的汇编指令,但是写法结构都大同小异。这里介绍一点基本的东西。.text下面的内容都是代码段,代码编译后的机器指令经常被放在代码段里.data是数据段,已初始化的全局变量和已初始化的局部静态变量经常放在数据段里.bss未初始化的全局变量和未初始化局部静态变量一般放在“.bss”段。& && && &在使用IDE的时候,这些东西一般是不需要考虑的,但是对这些段的理解还有哪些内容存储到哪里的了解,对于写程序是有帮助的,可以理解的更深,程序的结构写的也更加合理,尤其是写底层的程序的时候。& && && &下面就是地址的概念了,这是一个比较难的东西,起码对于我来讲是这样的,什么虚拟地址啊,物理地址啊,记得当时学微机原理的时候就学的云里雾里的,现在又碰到了,果然就撞墙了。S3C2440有两种启动方式,一种是NOR启动,这种启动方式的0地址位于NOR的0地址,因为NOR的访问方式和RAM的访问方式相同,所以程序可以直接在NORFlash中运行。另外一种方式是NandFlash起动,因为NandFlash的访问方式相对比较复杂,有别于RAM的访问方式,所以必须要把NandFlash中的程序复制到RAM中才可以运行,这种启动方式的0地址位于芯片内部的RAM的首地址位置。从NandFlash启动,芯片上电后会强制把NandFlash前面的4K内容复制到芯片内部的RAM,然后从RAM的0地址开始执行代码。像GPIO这样的程序比较小,所以不用考虑大于4K以后的内容。但是如果程序大于4K,这时前面4K的程序就要具备这样的功能:把4K以后的程序复制到SDRAM,然后运行。& && && &再者就是寄存器的概念,芯片内部有很多的外设,包括GPIO、UART、IIC等等,这些外设的访问、控制都是通过操作寄存器来完成的,功能寄存器就可以理解成一个开关,搞成0就选择了一个功能,搞成1就选择了另外一个功能,多位控制就可以理解为几个开关的组合,对于芯片的操作,寄存器的理解是很重要的。& && && &怎么通过C语言操作寄存器呢?每一个寄存器都有一个地址,C语言中和地址有关的那就又扯到指针了,指针就是一个地址,但是这个地址有相应的格式,比如char * p,这个p就是一个指向char类型的指针,而S3C2440内部的寄存器是32位的,所以定义一个寄存器的方式如下(以GPIOFDAT为例,这是GPIOF的数据寄存器,读F组IO口的数据以及写F组IO口的数据都操作它,它的地址是0X,这些数据在S3C2440的芯片手册上都是可以查的到的):#define GPFDAT& && &(*(volatile unsigned long *)0x)这句是一个宏定义,GPFDAT就代表了(*(volatile unsigned long *)0x),(volatile unsigned long *)0x这是一个强制转换,把0X强制转换成一个指向无符号长整型的指针,地址就是0X,而*是访问指针指向地址中的内容的符号,比如p是一个指向a(它的值为10)的指针,*p就是访问了a的内容,就是10,*p=20,这时候a的值就被改成了20。所以(*(volatile unsignedlong *)0x)就是访问了0X这个地址中的内容,就可以对这个寄存器进行读和写的操作了。& && && &代码的问题解决完了,剩下的就是编译连接的问题了。一个C语言程序从代码到可运行的二进制文件,经历了预处理、汇编、编译、连接的过程。预处理就是处理C语音代码中的一些宏,比如替换#define定义的东西,处理#if这些宏。汇编就是把C语言代码变成汇编代码。编译就是将汇编代码变成OBJ目标文件;连接就是将几个目标文件、系统库的OBJ文件、库文件连接起来,最终生成一个可以在目标平台运行的可执行文件。用到的工具是arm-linux-gcc,这是一个综合工具,可以进行预处理、汇编、编译、连接等工作,根据编译选型进行相应的操作。& && && &最后把程序下载到开发板子上,LED亮了,当然了,为了显示确实是自己写的程序在起作用,我一般把多个灯弄成亮暗交替的形式,有的时候全亮或者全灭没办法说明问题。因为以前有单片机的开发经验,所以整个逻辑程序的开发过程整体上还算是比较顺利的,只是有些以前没有涉及过的东西要学习一下再进行。在这里我有一个小小的建议就是,学东西要边学边用,边用边学,不要有那种心理:等我全学会了再做东西。那样是学不会的,起码是学不好的,用的过程中可以发现问题,然后再有针对性的去学习,这样理解更加深刻,记的也更持久,不然是很容易早泄的。还有就是学习要慢慢来,肾虚了就慢慢补,靠吃伟哥的方式是不可取的。
13:40:42  
楼主用的哪一种开发板?
11:15:21  
楼主用的哪一种开发板?
我的开发板是韦东山的JZ2440
Powered by& & & & 实验目的:用C语言在 jz2440上实现流水灯& & 实验原理:& & 在这里点亮一个nLED_1,nLED_2,nLED_4,其对用的引脚是GPF5,GPF6,GPF7,在GPIO中,每个引脚对有配置寄存器和数据寄存器,对于本例其配置寄存器为GPFCON:0x,和数据寄存器GPFDATA:0x,【7,6】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0xx).
,【9,8】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0xx).
,【11,10】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0xx).
,这样依次点亮他们。& & 实验步骤:& & 在linux下编辑源程序,其中源程序包括启动文件:完成关门狗和初始化栈的初始化,然后利用自己编写的Makefile来对源程序的编译和链接生成bin文件,最后通过文件传输到window下,利用板子里nor flash中的u-boot烧写 到
nandflash。再利用window下的dnw下载到板子里面.最后重启板子,对板子设为nand flash启动,运行程序,观察效果。& & 实验工具:远程登录开发板jz2440工具:SecureCRT 5.2、
实现linux和window文件共享工具SSH Secure File Trsanfer Client& & 编译工具:linux下的交叉编译链(即编写一个makefile文件来对文件进行编译连接)& & 注意:这里必须要进行对栈的初始化。在反汇编的时候可以看到,在完成初始化的时候,一些寄存器的值要保存到栈里面,等main函数返回时,要恢复寄存器的值。这里由于程序很短,用不到4K,所以在SRAM中(俗称垫脚石,由硬件将nandflash的前4K存储到里面)的前面部分用来存储该裸板程序,其余的是空余的,在这里直接把栈的指针指向K的末尾,进行存储寄存器的值。& & 实验代码:启动代码crt.S 和流水灯实验代码len_on_c.c& & 启动代买crt.S:.text.global _start_start: ldr R0, =0x mov R1,#0x0 str R1,[R0] ldr sp, =1024*4 bl mainhalt_loop:
b halt_loop& & 流水灯led_on_c.c:#define GPFCON (*(volatile unsigned long*)0x)#define GPFDAT
(*(volatile unsigned long*)0x)void delay(int n){
int i,j; for(i=0;i&n;++i)
for(j=0;j&50;j++) ;}int main(){
int i=0; while(1) {
GPFCON=0x;
for(i=0;i&3;i++)
delay(1000);
GPFCON=GPFCON&&2;
GPFDAT=0x;
return 0;}& & MAKefile文件:led_on_c.bin: crt.S
led_on_c.c arm-linux-gcc -g -c -o led_on_c.o led_on_c.c arm-linux-gcc -g -c -o crt.o crt.S arm-linux-ld -Ttext 0x -g crt.o led_on_c.o -o led_on_c_elf arm-linux-objcopy -O
binary -S led_on_c_elf led_on_c.bin arm-linux-objdump -D -m arm led_on_c_elf &led_on_c.dis.PHONY:cleanclean:
rm -f *.bin *.o
led_on_c_elf led_on_c.dis& & 备注:下面看看又反汇编得到的led_on_c.dis文件,看看栈初始化的目的& & &_start&:
0: e3a00453
mov r0, # ; 0x
4: e3a01000
mov r1, #0 ; 0x0
8: e5801000
str r1, [r0]
c: e3a0da01
mov sp, #4096 ; 0x1000
10: eb00001a
bl 80&main&70: baffffef
blt 34&delay+0x1c&74: e28bd000
add sp, fp, #0 ; 0x0
78: e8bd0800
7c: e12fff1e
bx lr& & &delay&:
18: e52db004
; (str fp, [sp, #-4]!)
1c: e28db000
add fp, sp, #0 ; 0x0
20: e24dd014
sub sp, sp, #20 ; 0x14& & 28: 6965772f
stmdbvs r5!, {r0, r1, r2, r3, r5, r8, r9, sl, ip, sp, lr}^44: 490b3b0b
stmdbmi fp, {r0, r1, r3, r8, r9, fp, ip, sp}
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
上一篇:下一篇:
相关经验教程
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.002 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.001 收益
的原创经验被浏览,获得 ¥0.005 收益
的原创经验被浏览,获得 ¥0.005 收益随笔 - 211&
文章 - 0&评论 - 31&trackbacks - 0
随笔分类 - mini2440裸奔
摘要: DM9000驱动在MINI2440上的移植学习笔记
想了解一下DM9000的移植修改原理,所以分析了一下时序图和引脚连接
首先看一下DM9000的引脚和MINI2440的引脚连接
DM; MINI2440 功能描述 SD0   DATA0  数据信号 |       &#16...
xilentz 阅读(3049) |
摘要:     /mcu8031/blog/item/cc625dc540171.html
单片机驱动DM9000网卡芯片(详细调试过程)【下】
4、验证初始化中的各个函数。
下面我们来看一下,上面所写的初始化函数是否可用。以上我们写好了三个函数,分别为
DM9000_init(),sendpacket()和...
xilentz 阅读(2396) |
摘要: 单片机驱动DM9000网卡芯片(详细调试过程)【上】
和其它网卡芯片不同,DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关ARM-Linux的开发板上的网络连接部分几乎都是采用该芯片完成的。当然,其它网卡芯片,如RTL8019的应用也很常见,在很多开发板上得到应用然而RTL8019的介绍在网上可以找到非常详细的介绍,尤其是用单片机对其做底层驱动的介绍...
xilentz 阅读(5033) |
摘要: eboot下使用的DM9000驱动源代码
#include &windows.h&
#include &halether.h&
#define DM9000_ID  0x90000A46
// Hash creation constants. // #define CRC_PRIME      &...
xilentz 阅读(654) |
摘要: lwIP+ucos2移植于S3C2440过程
一般采用的步骤: 1.深入了解所采用的系统核心 2.分析所采用的C语言开发工具的特点. 3.编写移植代码. 4.进行移植的测试 5.针对项目的开发平台,封装服务函数. 首先,是芯片的中断处理机制,如何开启,屏蔽中断,可否保存前一次中断状态,芯片是否有软中断或陷阱指令 已经将图片移植成功,是一件很快乐的事情. 现在要将网络也加进去,看一看,想什么办法能...
xilentz 阅读(3774) |
摘要: ucos II+ucGUI+s3c2410+LCD+触摸屏整合
上一篇 / 下一篇 
13:15:02 查看( 108 ) / 评论( 0 ) / 评分( 0 / 0 )
    环境:ads2.2+ARM9 +s3c2410       注意:由于编译器(ads1.2或2.2)对全...
xilentz 阅读(1965) |
摘要: LWIP-1.3.0在S3C2440平台UCOS-II-2.8.6系统上的移植过程DEBUG
上一篇 / 下一篇 
08:38:40 查看( 175 ) / 评论( 0 ) / 评分( 0 / 0 )
1.内存池地址对齐问题 timer tcon=, tcnt dc7e, tcfg 00000 uC/OS-II, The ...
xilentz 阅读(936) |
摘要: 基于S3C2440和DM9000移植LWIP(一) 终于开始我的第一篇笔记了。这回要做的事情,是以太网的移植。
使用mini2440已经有一段时间了。诸如裸机的LED,键盘开关等等等等也都试验过了,uCOS,WinCE也是浅尝了一下。如今想到了以太网。
由于mini2440的板上集成了一个DM9000的网卡,并且在CE系统里面成功的使用以太网与PC连接了。于是自然而然的想,能不能在uCOS下也...
xilentz 阅读(806) |
摘要: nboot + eboot 只在nandflash上下载内核(mini2440开发板)          搞了一个多月终于把bootloader搞定了,说起来这已经是第二次整这个bootloader了,记得上次nboot跳转eboot时总是死机,好像没有跳转到eboot的样子,想了好久,一直以为是nboot的问题,因为...
xilentz 阅读(564) |
摘要: 单片机驱动DM9000
和其它网卡芯片不同,DM9000系列网卡芯片在嵌入式开发板上很常见,尤其是有关ARM-Linux的开发板上的网络连接部分几乎都是采用该芯片完成的。当然,其它网卡芯片,如RTL8019的应用也很常见,在很多开发板上得到应用然而RTL8019的介绍在网上可以找到非常详细的介绍,尤其是用单片机对其做底层驱动的介绍非常丰富。下面的网站就介绍了用AVR驱动RTL8019网卡芯片的非...
xilentz 阅读(2940) |
摘要: 裸奔程序和uCOS读取DM9000 ID的方法
在程序中调用下面这段代码可以读到DM9000的ID号: #define        DM9000_BASE              &#...
xilentz 阅读(1028) |
摘要: 基于S3C2440的LWIP-1.3.0和DM9000在UCOS-II-2.8.6上的移植
经常在Linux上跑,一时间跳到UCOS,感觉有点不习惯。首先是编译器,GCC是个不错的选择,但GDB调试太麻烦。ADS和仿真器结合是个十分不错的调试环境,于是,将代码就搬到ADS上,这下完全脱离Linux,整个开发过程都在Windows进行。其实是UCOS太简洁了,时钟、接口很多都需要自己开发…小弟对U...
xilentz 阅读(1054) |
摘要: 有人在无os下使用DM9000吗?【恢复】 回复数:16,点击数:1074 【楼主位】 zchong 积分:850 派别: 等级:------ 来自:中国·南京 最近在ADS下驱动DM9000老是不成功,不知道有没有人在无os下对DM9000操作?
,12:46:09 资料
引用回复 编辑
删除 【1楼】 ql103 积分:84 派别: 等级:------...
xilentz 阅读(948) |
摘要: 以太网控制芯片DM裸机上终于能正确接收数据了(源代码工程已经上传) (411.47 K) 该附件被下载次数 168 弄了几天DM9000了,一直不能正确接收数据,郁闷了几天,现在终于行了,高兴一下。 参考了这篇文章《单片机驱动DM9000网卡芯片(详细调试过程)》,文章很好,写的很详细,对DM9000驱动感兴趣可以看看原文
/mikenoo...
xilentz 阅读(1880) |
摘要: DM9000初始化过程
提交者: a00 日期:
15:20 阅读: 124
drivers/dm9000x.c eth_init()函数 这里的初始化并不复杂,首先对dm9000进行复位 static void dm9000_reset(void) {        DM9000_DBG(&resett...
xilentz 阅读(2786) |
摘要: DM9000寄存器功能详细介绍
提交者: a00 日期:
16:09 阅读: 44
    DM9000(A)是一个全集成、功能强大、性价比高的快速以太网MAC控制器,它带有一个通用处理器接口、EEPROM接口、10/100 PHY和16KB的SRAM(13KB作为接收FIFO,3KB作为发送FIFO)。它采用单电源供电,可兼容3.3V、5V的...
xilentz 阅读(2325) |
摘要: S3C2440A驱动RGB接口TFT LCD的研究(转载) 收藏 S3C2440A驱动RGB接口TFT LCD的研究时间: 11:29:50 来源:嵌入式在线 作者:纪宁宁,孙灵燕 1 引言 随着科技的进步,TFT LCD作为显示器件在各种嵌入式系统中得到越来越广泛的应用。带触摸屏的TFT LCD模组在系统应用中不仅能为人机界面提供高质量的画面显示,而且能提供更直观、方便的交互...
xilentz 阅读(2273) |
摘要: JLINK+ADS+mini2440配置////配置J-Link为mini2440烧写bootloader 收藏 使用ADS1.2的时候进入AXD调试环境回出现& the session file could not be loaded& 解决方案:1:将工程文件放在不包含中文路径的目录下。
2:设置AXD-&confing Interface 中general中的...
xilentz 阅读(4865) |百问网精智JZ2440开发板使用手册 S3C2440_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
百问网精智JZ2440开发板使用手册 S3C2440
上传于||文档简介
&&百​问​网​精​智​J​Z40​开​发​板​使​用​手​册
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩41页未读,继续阅读
你可能喜欢}

我要回帖

更多关于 jz2440 uboot 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信