博文

arm-linux交叉编译配置(2008-07-03 20:59:00)

摘要:这条命令挺有用,也贴出来了rm -dfr abc man rm (删除abc文件夹,其中abc文件夹中含有子文件夹,且子文件夹中也含有文件)
我原来把crosstools_3.4.1_softfloat.tar.bz2交叉编译工具链解压到/tmp的目录下了,后来不想放到此目录下,就要把它整体删除了,这个命令就可以做到 下面来详细说明整个交叉编译环境的建立的过程
先说一下我个人的配置环境
主机:Windows XP sp2
虚拟机:vmvare 5.5
从机:RedHat 9.0
建议:在安装Linux的时候希望你同时把所有的软件全给装上,这样能给你在日后的使用中省下很多特别麻烦的事
 本文所描述的前提是在安装RedHat 9.0时已经把C开发环境安装好,这样就省去了这一步. 一: 解压交叉编译的工具链
 整个过程先切换到root权限下(su命令)
 先切换到cd /usr/local 目录下
 mkdir arm 建立一个名为arm目录
 命令 tar jxvf crosstools_3.4.1_softfloat.tar.bz2 -C /usr/local/arm 
 当然你也可以不解压到/usr/local/arm目录下,后面那个你自己想放哪就放哪
 在此注意,如果你用的交叉编译工具为cross 2.95.3则不能解压到任意目录,只能解压到根目录
 也就是说你得使用命令tar jxvf cross 2.95.3.tar.bz2 -C /  ,如果不解压到根目录,将会出现一系列莫名奇妙的问题。这是好多前辈已经 遇到过的, 二:把交叉编译器的路径加入到PATH。(两种方法a,b) a、 export PATH=$PATH:/usr/local/arm/opt/EmbedSky/crosstools_3.4.1_softfloat/arm-linux/gcc-3.4.1-glibc-2.3.3/bin         注:(这只能在当前的终端下才是有效的,是即时的) b、修改/etc/profile ......

阅读全文(3102) | 评论:0

bashrc与profile比较(2008-07-03 20:59:00)

摘要:登录Linux的console操作环境后,会出现一个提示符号,在这个提示符号之后可以输入命令,Linux根据输入的命令会做回应,这一连串的动作是由一个所谓的 Shell 来做处理。
Shell是一个程序,最常用的就是Bash,这也是登录系统默认会使用的Shell。

profile与bashrc都是Shell的启动设置档,角色类似Microsoft DOS/Windows下的autoexec.bat文件,以下就是这二种文件自己个别的文字叙述。

针对个别用户
用户家目录/.bashrc
# ~/.bashrc: executed by bash(1) for non-login shells.
用户家目录/.profile
# ~/.profile: executed by Bourne-compatible login shells.

针对全体用户
/etc/bash.bashrc
# System-wide .bashrc file for interactive bash(1) shells.
/etc/profile
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))

由以上叙述可以知道,差异在于:
1.bashrc
系统启动后就会自动运行。
2.profile
用户登录后才会运行。 3.进行设置后,可运用source bashrc命令更新bashrc 也可运用source profile命令更新profile 通常我们修改bashrc,有些linux的发行版本不一定有profile这个文件......

阅读全文(1373) | 评论:0

计算机科学与技术学习反思录(2008-07-02 16:27:00)

摘要:本文转自72松的博客,(在我博客的收藏夹里有该博客地址) http://www.frontfree.net/view/article_746.html 计算机科学与技术学习反思录 计算机科学与技术这一门科学深深的吸引着我们这些同学们,上计算机系已经有近三年了,自己也做了一些思考,我一直认为计算机科学与技术这门专业,在本科阶段是不可能切分成计算机科学和计算机技术的,因为计算机科学需要相当多的实践,而实践需要技术;每一个人(包括非计算机专业),掌握简单的计算机技术都很容易(包括程序设计),但计算机专业的优势就在于,我们掌握许多其他专业并不“深究”的东西,例如,算法,体系结构,等等。非计算机专业的人可以很容易地做一个芯片,写一段程序,但他们做不出计算机专业能够做出来的大型系统。(与司徒彦南兄的谈话)今天我想专门谈一谈计算机科学,并将重点放在计算理论上。 计算机理论的一个核心问题–从数学谈起: 记得当年大一入学,每周六课时高等数学,天天作业不断(那时是六日工作制)。颇有些同学惊呼走错了门:咱们这到底念的是什么系?不错,你没走错门,这就是计算机科学与技术系。我国计算机科学系里的传统是培养做学术研究,尤其是理论研究的人(方向不见得有问题,但是做得不是那么尽如人意)。而计算机的理论研究,说到底了,如网络安全,图形图像学,视频音频处理,哪个方向都与数学有着很大的关系,虽然也许是正统数学家眼里非主流的数学。这里我还想阐明我的一个观点:我们都知道,数学是从实际生活当中抽象出来的理论,人们之所以要将实际抽象成理论,目的就在于想用抽象出来的理论去更好的指导实践,有些数学研究工作者喜欢用一些现存的理论知识去推导若干条推论,殊不知其一:问题考虑不全很可能是个错误的推论,其二:他的推论在现实生活中找不到原型,不能指导实践。严格的说,我并不是一个理想主义者,政治课上学的理论联系实际一直是指导我学习科学文化知识的航标(至少我认为搞计算机科学与技术的应当本着这个方向)。 其实我们计算机系学数学光学高等数学是不够的(典型的工科院校一般都开的是高等数学),我们应该像数学系一样学一下数学分析(清华计算机系开的好像就是数学分析),数学分析这门科学,咱们学计算机的人对它有很复杂的感情。在于它是偏向于证明型的数学课程,这对我们培养良好的分析能力极有帮助。我的软件工程学导师北工大数理学院的王仪华先......

阅读全文(1473) | 评论:0

关于arm中断地址解析函数的一段代码完全解析(2008-06-26 15:24:00)

摘要:先把指令给出 下面是三星公司附带的init.s程序中的一个宏定义,用于中断地址解析 MACRO $HandlerLabel HANDLER $HandleLabe;这是带了两个参数的宏定义,具体语法不明白可参看相关的ARM指令的汇编手册 $HandlerLabel Sub    sp,sp ,#4; stmfd sp!,{r0}; ldr   r0,=$HandleLabel ldr   r0,[r0]; str  r0 {sp #4}; ldmfd   sp!,{r0,pc} 首先第一条指令,sub sp,sp,#4,费减了我大半天时间,为什么压栈前非得减4,弄了好长时间才把整段代码看明白,人比较笨,没办法,只得一步一步爬着走。 先解释第一条,将堆栈指针的内容减去4是有原因的,是为了给PC留4个字节, stmfd sp!,{r0};这条指令是一条压栈操作,执行它后sp的指向的地址将会自动加或者减,具体加还是减得取决于你所定义的堆栈操作方式。我在前边用的是满递减方式,故在此执行这条指令将会导致SP的值自动减 ldr   r0,=$HandleLabel ldr   r0,[r0]; 这两条批令不解释,很简单,是将中断服务函数的地址装入了r0 str  r0 {sp ,#4};这条指令,首先明白它并不是一条压栈的指令,却做到了压栈的作用,他将r0中的内容保存到sp+4指向的堆栈空间。 ldmfd   sp!,{r0,pc}这条指令也让我想了很长时间,后来想想自己太笨了,这是一条出栈指令,同时也会使堆栈指针自动更新,便是使用得注意顺序,得按后进先出原则的堆栈操作规则来,在此虽然此指令ldr   r0,[r0](存入的是ISR地址)后存入进去,但是它的地址却比先存入进去的原寄存器r0的地址高,(stmfd sp!,{r0};),也就是说当前SP是指向stmfd sp!,{r0}这条令压入栈后的地址,所以出栈时先出来的是这条指令压入的内容,后一个是ISR的地址,将其出栈后给予PC,这样就可以处理中断服务函数子程序了。 这是我个人的理解,具体是否有错......

阅读全文(2449) | 评论:0

arm异常处理(转)(2008-06-23 08:47:00)

摘要:刚接触ARM,对它的异常返回理解不是很好,总认为丢了两条指令没有执行,看了这个明白了,后面有一个PC的修正过程,修正的偏移量根据异常的类型不同!
ARM的异常处理        对于ARM核,可以且只能识别7种处理器异常,每种异常都对应一种ARM处理器模式,当发生异常时,ARM处理器就切换到相应的异常模式,并调用异常处理程序进行处理。        ARM核异常处理的一般过程是:        (1)保存异常返回地址到r14_<exception_mode>(确切的说是当前PC);        (2)保存当前CPSR到SPSR_<exception_mode>;        (3)改写CPSR以切换到相应的异常模式和处理器状态(ARM状态);        (4)禁止IRQ(如果进入FIQ则禁止FIQ);        (5)跳转到相应异常向量表入口(例如IRQ跳转到IRQ_Handler入口);        【注】复位异常处理会禁止所有中断,另外由于不用返回,因此不需要作(1)(2)步。          上面的异常处理操作都是由ARM核硬件逻辑自动完成的,软件则需要完成以下工作:        (1)为ARM核建立异常向量表。ARM体系结构中定义了各种异常的入口地址,例如复位异常的入口地址为0x0,发生复位时,ARM核自动跳转到0x0处开始执行。因此,需要在各入口地址处放一条跳转指令,跳转到相应的异常处理服务程序。因此,异常向量表就是从0x0地址开始的8个字(除了7条跳转到上述异常处理程......

阅读全文(3150) | 评论:0

关于arm中的字对齐(2008-06-22 17:09:00)

摘要:原文地址:http://blog.ednchina.com/cllzs/49740/message.aspx 首先说说,什么叫对齐。如果一个数据是从偶地址开始的连续存储,那么它就是半字对齐,否则就是非半字对齐;半字对齐的特征是bit0=0,其他位为任意值。字对齐的特征是bit1=0,bit0=1,其他位为任意值。如果一个数据是以能被4 整除的地址开始的连续存储,那么它就是字对齐,否则就是非字对齐。举例说明四字节对齐: 对内存进行操作时,被访问的地址必须为4的倍数。如果分配到的地址的地址不是4的倍数时,CPU实际访问的地址还是按照字对齐的方式来操作。也就是自动屏蔽bit1和bit0.          用ADS的ARM C Complier下Optimization Level可能引起问题,其中的一个问题就是字节对齐的问题。下面讲讲问题的现象及实质。        当时问题的现象是:程序使用一公共变量Buf创建队列,如果ADS编译优化选项采用Minium则软件工作正常;源码不变,如果采用ALL优化,则不正常,数据紊乱且无法工作。为了发现问题,我们分别用Minium和ALL编译,在反汇编条件下单步跟踪程序,观察CPU寄存器和内存变量的变化情况。发现在Minium模式下,编译器把队列内存块Uart0TxBuf分配到的地址是0x400015cc,这个地址是一个4字节对齐的地址,而在ALL模式下,编译器把Buf分配的地址是0x400015c2,这个地址是一个非4字节对齐的地址。正是由于这个非4字节对齐的地址导致了问题的发生。
问题发生在QueueCreate(void *Buf, uint32 SizeOfBuf, uint8 (* ReadEmpty)(), uint8 (* WriteFull)())这个函数里,问题是如何发生的,
        在了解问题发生的机理前,先了解QueueCreate这个函数的工作原理。QueueCreate工作原理是,首先把buf指向的内存初始化为DataQueue格式的结构体。  DataQueu......

阅读全文(2908) | 评论:0

ARM入门的一些经验(写得比较好,建议打算开始学arm的先看看)(2008-06-20 17:16:00)

摘要: ARM入门的一些经验 [日期:2008-3-31] 来源:Internet  作者: [字体:大 中 小]   一 首先说说ARM的发展

      可以用一片大好来形容,翻开各个公司的网站,招聘里面嵌入式占据了大半工程师职位。
广义的嵌入式无非几种:传统的什么51、AVR、PIC称做嵌入式微控制器;ARM是嵌入式微处理器;DSP;FPGA。
      客观的讲,工作需求量上DSP的需求比ARM要多,而ARM和FPGA差不多。
      DSP因为数字处理与通信领域的空前发展而火暴,小到MP3 射象头,大到我们军品里的控制器,应用面很广。
      FPGA的兄弟一般做ANSIC(特殊芯片设计,好象是这么翻译的)。而ARM单纯说来并不比一个单片机强多少,但是它的独特就在于不断下降的价格和提升的性能。这完全依靠于ARM公司的战略,厉害!!很佩服他们的战略眼光!!
      值得注意的是:在找工作中,企业(著名的,小的不算)对单纯的ARM硬件开发工程师并不比单片机重视,很少有大企业的职位里写“从事过ARM开发优先”。写的多的是什么?“嵌入式LINUX”到这相信大家看出来了吧,需要的是硬件中的软件。


二 ARM是硬件还是软件

      很难说,ARM是硬件,LINUX是软件。ARM的硬件多半已经模块化了,像我这样把板子改成这样的就算动的多的了,这同样是ARM公司的战略,再次佩服。
      实际中的LINUX的开发工作更多,更耗时。从这方面说ARM应该算是软件了。
      在找工作中更是这样,举个例子,联......

阅读全文(2902) | 评论:1

ucos-ii移植笔记(转)(2008-06-05 15:51:00)

摘要:转自:着色部分写得不错。 http://blog.mcuol.com/User/kleiokdo/Article/1870_1.htm (1)实时系统和前/后台系统;
前/后台系统:一个大循环,循环查询各种标志位。如果标志位置位,就执行相应的服务程序。标志位就是标志事件的发生,事件响应延时处于不可预测状态。最坏的情况是循环中所有其他的事件服务程序执行完,才响应当前事件。中断服务虽然能即时/优先响应,但是它们和主循环的通讯,也是通过置主循环中相应的标志位来完成的。
实时系统(uCOS):整个程序分成一个个看起来好象是并行的任务,每个任务都在等待事件的发生。除了最低优先级任务(在uCOS中是IDLE任务)是死循环以外,其他的任务都不能死循环,只能在驱动事件驱动下工作。任何驱动事件的产生,都使优先级最高的就绪任务运行。任务和任务/任务和中断的通讯,是通过相应事件驱动来完成的。
驱动事件:
不论是什么系统,CPU不可能一直在工作。CPU的工作是在各种驱动事件的驱动下工作的。CPU在完成一次驱动事件事件服务程序以后,进入IDLE模式等待新的驱动事件的发生。包括实时系统和前/后台系统都是在驱动事件的驱动下运行的。
按照uCOS中的观点,驱动事件分为三类:
1、事件 (Event)。包括信号量(Semaphores)、事件标志组(Flag)、邮箱(Message Box)、邮箱队列(Message Queue)。
2、时间(Time Tick)。包括时间延时和事件超时。
3、中断(Interrupt)。可以发出各种event。
由于第1种事件,通常都是在第2、3种状态下发出的,所以其实事件的驱动只有两种:时间(定时)和中断(各种异步中断)。
时间实际上也是中断的一种,可以说程序的驱动事件只有一种,就是:中断。
前/后台系统中还有一种驱动事件的产生,在主循环中不断的查询。有别与一般的定时查询,这种查询是为了将事件的响应时间降到最低,也可以将其归纳于定时(时间)事件。
(2)uCOS C51移植的准备工作;
2004年8月份,我在书城买了一本《uCOS-Ⅱ 第2版》,准备学习RTOS。因为以前没有玩过RTOS,在工作之余断断续续的看了3、4章。一直到12月初的时候,公司要重新设计一个项目,恰好要把uCO......

阅读全文(5653) | 评论:0

ucos-ii核心算法分析(转)(2008-06-04 09:48:00)

摘要:  来自http://www.yuanma.org/data/2007/0207/article_2249.htm   μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其 内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展 性强等特点,最小内核可编译至2KB。μC/OS-Ⅱ为何如此高效呢?我们从它的核心算法——任务调度算法开始分析。
2.1任务调度算法分析
        操作系统的实时性主要体现在:当优先级高的任务要求工作时,操作系统要以尽快的时间将此任务调度到CPU执行。这里所花费的时间主要包括两部分:查找最高 优先级任务和任务上下文切换。其中,任务上下文切换时间是和处理器相关的,操作系统无法控制。我们主要分析uC/OS-ii如何查找最高优先级任务的。
          因为任务较少,uC/OS-II采用单一优先级,这为算法的实现提供了很大的方便在uC/OS-II中,优先级可以作为任务的标识(当然要在任务存在的情况下,是通过一个指针数组实现的)来用。
            调度算法主要基于分级查询。考虑到任务数目<64,可以用6bit来表示,分为高3位和低三位。uC/OS-II将优先级进行分组,按高三位进行 分组,可得8个(最多)优先级数组(000-111);每个优先级的在数组中的位置由其低三位表示。在源码中,高三位用带Y后缀的变量表示,而低三位用带 X后缀的变量表示。这样建立了1个变量OSRdyGrp(INT8U,8bit,每个bit代表一组)和1个数组OSRdyTbl[8](INT8U,每 组8bit,每个bit代表一个优先级)。这样形成了的二级查询,先选组,再选组内偏移。
        其中,OSRdyGrp每一bit置1,表示该组有任务就绪。(第0~7组)。其示意图见下图:

我们举一个例子,看一下如果优先级为22的......

阅读全文(1134) | 评论:0

关于dspbuilderblock.v库的问题(2008-06-01 16:18:00)

摘要:以下是我个人做一个小系统的经过:贴出来共享,如有谁能找到方法解决Error: WYSIWYG RAM primitive "ram_block1a2" must have Port A, Address port or parameter specified这个问题,给我留个言,因为 这个导致我去用dsp_bulder 中的RAM,再遇到问题,才解决了。 以下是我在EDACN论坛上发的贴和自己回的贴,我给他拷贝过来了。同时,也给我们提供了一种思路,若需要用的一些模块没有IP,而写起来又会相当复杂,想想能否利用DSPBUILDER来构建也不失为一种好的方案。它拥有较有好的GUI,搭建一些较复杂的算法是比直接用HDL来描述是简单多了。效率方面我也不清楚,估计会低一点.
我在一个系统中用到了一个ram 的lpm,使用上是没问题的,可在分析与综合阶段就出现错误:
Error: WYSIWYG RAM primitive "ram_block1a2" must have Port A, Address port or parameter specified
此后我就打算使用DSP_builder中的dual -port ram
使用后生成的vhdl文件,我再想将其升成symbol file图形文件时,则出现加载库的问题,
错误如下:Error (10481): VHDL Use Clause error at dsp_ram.vhd(27): design library "dspbuilder" does not contain primary unit "dspbuilderblock"
此时我上dsp_builder 与quartus II安装目录中找相关的库文件,却找不到dspbuilderblock.vhd这个文件, 不知怎么解决?大家给点意见?
能否给讲讲dsp_bulder 生成文件vhdl文件的相互关联?   我相信这是可以实现的,只是我没有找到适当的方法,或者知识还不够。厂商给我们的是一个SOPC的理念,在这种思想的指引下,符合它的理念的就应该能实现的。一个偶然的巧合,我对一个模块进行了一下仿真,因为在DSP中生成的模块,里面含有两个tcl 脚本文件,一个是用于测试的,tv_*.vhd,假如你需要......

阅读全文(3932) | 评论:0