2012年10月15日
摘要: 在《GNU ARM汇编--(十五)linux下的printascii》中已经初步分析了自己写的bootloader在引导kernel时候出现的commandline在bootloader和kernel之间传递的问题,今天终于解决了,并对参数传递有一些研究: 传递的参数为:[cpp]view plaincopyprint?params->u1.s.page_size=LINUX_PAGE_SIZE;params->u1.s.nr_pages=(DRAM_SIZE>>LINUX_PAGE_SHIFT);params->commandline[COMMAND_LINE_ 阅读全文
posted @ 2012-10-15 22:29 Daniel.G 阅读(509) 评论(0) 推荐(0) 编辑
摘要: 在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。 这篇blog只是分析解决这个问题的第一步: 既然"Uncompressing Linux..."这句打印是kernel代码中的,那kernel的其他打印怎么没有? 在arch\arm\boot\compresse 阅读全文
posted @ 2012-10-15 22:28 Daniel.G 阅读(675) 评论(0) 推荐(0) 编辑
摘要: 以前工作中用过arm7,没有MMU,也没有用任何OS.现在回忆当时的代码结构,我觉得可以叫无限循环的有限状态机.arm7不跑OS,就相当于单片机,单片机跑的肯定是无限死循环.有限状态机是因为整个代码要处理很多外部的事情,那就是大的循环里面来套小循环,以轮询的方式来检查外界的变化,然后系统作出变化,系统在有限的状态中切换. OS的一个标识就是支持多任务的并发.比方说linux,我们看起来是多个进程在同时运行,实际上还是cpu运行一下这个进程,再运行一下其他进程.这个就涉及到上下文切换以及进程调度的算法.当然我这里说的是单核的情况,如果是SMP的话,可能有些区别.暂时也没研究linux下的进... 阅读全文
posted @ 2012-10-15 22:27 Daniel.G 阅读(508) 评论(0) 推荐(0) 编辑
摘要: 在写GNU ARM汇编下的linker script之前,还是有必要看一下ldr指令,以及ldr和adr伪指令. ldr指令: LDR load word into a register Rd <- mem32[address] ldr伪指令: LDR Rd, =constant LDR load constant pseudoinstruction Rd=32-bit constant adr伪指令: ADR Rd, label ADR load address ... 阅读全文
posted @ 2012-10-15 22:26 Daniel.G 阅读(725) 评论(0) 推荐(0) 编辑
摘要: 说句题外话,在输入“指令”二字的时候,就想起了google搜索时,提示“令”不能搜索,要我换词汇.如果不能说脏话,我真就无语了. 在前面对具体芯片的各个基本模块做完了学习后,在上一篇小结中自以为已经具备了自己写个bootloader的条件,但其实错了,我还有很多基本的知识不了解.比如编译链接\gnu的linker script等等.也有很多地方只懂表面,没有做深入的理解. 在《GNU ARM汇编--(二)汇编编译链接与运行》中,仿照网上的例子做了makefile和linker script,在那篇blog的末尾我写道“根据google,做了上面的总结,对GNU ARM汇编有了认识,... 阅读全文
posted @ 2012-10-15 22:25 Daniel.G 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 前面阅读理解了I2C的官方协议文档后,就拿s3c2440和EEPROM来验证一下. 本来是想用s3c2440的SDA和SCL管脚复用为GPIO来模拟的,但在没有示波器的情况下搞了一周,怎么都出不来,最后还是放弃了.甚至参考了linux下i2c-algo-bit.c和i2c-gpio.c,依然没调出来.如果有示波器,可能很快就能找到原因,现在完全不知道问题出在哪里.其实想用GPIO模拟I2C的目的很简单,以一种简单而又深刻的方式来理解I2C. 既然这条路暂时没法走,退而求其次,用s3c2440的I2C接口来访问EEPROM,只要按照datasheet的来做,基本上不用考虑时序咯. ... 阅读全文
posted @ 2012-10-15 22:24 Daniel.G 阅读(1101) 评论(0) 推荐(0) 编辑
摘要: RTC概述 在系统电源关掉时RTC可以在备份电池的支持下来工作.RTC可以使用STRB/LDRB指令传输8bit的BCD值到CPU.数据包括秒,分,时,日期,天,月和年.RTC工作在外部32.768KHz的晶振下,而且有报警功能.属性 BCD:秒,分,时,日期,天,月和年 闰年产生器 报警功能:报警中断 从power-off模式唤醒 独立的电源管脚(RTCVDD) 为RTOS kernel time tick支持毫秒级的tick.闰年产生器 闰年产生器通过BCDDATA,BCDMON和BCDYEAR来决定每个月最后一天的日期.一个8bit的计数器只能表示两个BCD码,所以无法决定... 阅读全文
posted @ 2012-10-15 22:23 Daniel.G 阅读(1062) 评论(0) 推荐(0) 编辑
摘要: 依旧从datasheet开始看起,锻炼下阅读英文技术手册的能力PWM TIMER概述 s3c2440有5个16bit的定时器.Timer0,1,2和3有PWM功能.Timer4是没有输出管脚的内部定时器.Timer0有一个dead-zone产生器,用于大电流设备. Timer0和1共用一个8bit的预分频器,而timer2,3,4共用另外一个8bit的预分频器.每一个定时器都有一个时钟除法器,可以产生5个不同的除法信号(1/2,1/4,1/8,1/16和TCLK).每一个定时器从时钟除法器接收各自的时钟信号,除法器从各自的8bit预分频器接收时钟.8bit的预分频器是可编程控制的,将PCL.. 阅读全文
posted @ 2012-10-15 22:22 Daniel.G 阅读(1147) 评论(0) 推荐(0) 编辑
摘要: 从单片机起,watchdog就是必不可少的.在各种应用环境中,程序很可能跑飞或死掉,这时候就需要通过watchdog来保证整个系统重新恢复到正常状态. 照旧,给出s3c2440的datasheet说明:概述: watchdog timer用于由于噪声或者系统错误引起的程序跑飞了的情况下恢复处理器的正常操作.它可以被用作一个可以请求中断服务的普通16bit的内部定时器.watchdog timer产生128 PCLK的重启信号.特点: 有中断请求的普通内部定时器模式 当定时器计数为0(超时)时,产生内部的长达128PCLK周期的重启信号watchdog timer的操作: F18-... 阅读全文
posted @ 2012-10-15 22:20 Daniel.G 阅读(448) 评论(0) 推荐(0) 编辑
摘要: 在配置完s3c2440的系统时钟后,我们来控制串口.之所以将串口放在这么靠前,是因为串口会给我们带来更多的信息.在没有串口的时候,uboot启动阶段只能靠led来显示一些信息.那么有了串口,debug就方便很多了.在工作中,一般情况下,很少有机会用jtag口加上昂贵的codeviser工具进行debug,也很少用gdb进行远程debug的,用的最多的还是打开debug的define来分析确定问题. 还是从s3c2440的datasheet开始: s3c2440A的UART提供3个独立的异步串行IO口,每一个都支持中断和DMA.换句话来说,UART可以产生中断请求或DMA请求来在CP... 阅读全文
posted @ 2012-10-15 22:19 Daniel.G 阅读(721) 评论(0) 推荐(0) 编辑
摘要: 前面几篇利用GNU ARM汇编控制LED以及ARM的中断处理的设计,对ARM汇编以及体系结构有了一定的认识.后面的汇编学习会结合具体的芯片进行,一个为了更灵活熟练的使用汇编,二也是为了通过学习一款具体芯片来提炼出一些有价值的经验.此次选择的芯片是三星的s3c2440,arm920t的核,整个板子是TQ2440的板子,这个板子放了两年多了,零散的玩过一些,但是为了建立更有体系的知识结构,还是值得把它玩过个遍.可能这个芯片很过时了,应该很多人在玩6410,在工作中接触的也是arm11\Cortex-A9或者ppc,但是很多东西并不会过时的.虽然工作中接触的东西比较新,但是作为做应用的公司,很多底层 阅读全文
posted @ 2012-10-15 22:18 Daniel.G 阅读(614) 评论(0) 推荐(0) 编辑
摘要: 在上篇《GNU ARM汇编--(四)中断汇编之非嵌套中断处理》中分析了最简单的中断处理的写法,再看TQ2440启动代码中的中断向量表的写法就一目了然了.今天抽时间对嵌套中断处理的学习做下整理. 嵌套中断处理的核心代码如下:[cpp]view plaincopyprint?;/*;*____________________________________________________________________;*;*Copyright(c)2004,AndrewN.Sloss,ChrisWrightandDominicSymes;*Allrightsreserved.;*_____... 阅读全文
posted @ 2012-10-15 22:17 Daniel.G 阅读(1560) 评论(0) 推荐(0) 编辑
摘要: 在写这篇blog之前,不得不感慨一句:纸上得来终觉浅,绝知此事要躬行.作为EE出身的,虽然好久好久没用汇编写单片机的中断了,但自我感觉对中断的理解还是比较深入的,本以为在GNU ARM汇编下搞个中断会很容易,谁知道断断续续花了我几周.完全用汇编写中断和用c中的_irq写中断还是有区别的,谁用谁知道.还是那句话:深入细节是必须的,也是值得的. 这一篇blog的理论知识主要来源于:《ARM System Developer's Guide》. ARM的异常和相应的模式之间的对应关系见下表:当一个异常导致模式的改变时,内核自动地:1、把cpsr保存到相应模式下的spsr2、把pc保存到相应模 阅读全文
posted @ 2012-10-15 22:16 Daniel.G 阅读(930) 评论(0) 推荐(0) 编辑
摘要: 这一篇的知识来源全部来自《ARM System Developer's Guide》 从编程人员的视角来看,arm核是由数据总线连接的功能单元组成,如下图所示: 数据通过数据总线流向处理器核心,这里的数据可以是将要执行的指令,也可以是数据项.上面的图是Von Neumann体系的arm核,数据项和指令共用同一总线.而h哈佛结构体系的arm核就会用两个不同的总线. 就像所有的RISC处理器,arm采用load-store体系结构.也就是说它含有两条不同的指令类型来出入处理器.loar指令将数据从内存拷贝到寄存器,store指令是将数据从寄存器拷贝到内存.没有直接操作内存中... 阅读全文
posted @ 2012-10-15 22:14 Daniel.G 阅读(513) 评论(0) 推荐(0) 编辑
摘要: GNU的汇编器是GNU Tools的一部分,可以用来ARM的汇编语言源代码编译为二进制文件.关于GNU汇编器的介绍可以搜索《GNU Assembler Manual》.这里我们只是做一个简短的介绍,对GNU汇编器有一个大概的认识,同时通过两个例子了解一下GNU ARM汇编. 给出一个模板文件:[cpp]view plaincopyprint?.text;Executablecodefollows_start:.global_start;"_start"isrequiredbythelinker.globalmain;"main"isourmainprog 阅读全文
posted @ 2012-10-15 21:33 Daniel.G 阅读(910) 评论(0) 推荐(0) 编辑
摘要: 在大学的时候,汇编就是学的很烂.一是对汇编这门语言没概念,二是那些指令集很难记清楚,用的机会也少,自然学的不好.但是现在觉得相当有必要重头学习一下汇编.部分原因我在上一篇写完设备模型的总结时提到了而.最近在看一本书《ARM:Assembly Language Programming》,作者是Peter Knaggs & Stephen Welsh.作者在开头也提出学习汇编的必要性和重要性,借他们的话重新说一下: 他们首先用三个问句来引出为什么要学习汇编: 外科医生为了知道手术刀的用法而需要学习冶金吗?飞行员需要学习热力学理论来理解飞机引擎是如何工作的?报社的记者要学习电子学来理解照.. 阅读全文
posted @ 2012-10-15 21:31 Daniel.G 阅读(469) 评论(0) 推荐(0) 编辑