当前位置:首页 > 嵌入式 > 嵌入式软件
[导读]选择开发工具在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用于目标系统的交叉编译器、连接

选择开发工具在嵌入式系统设计中,开发工具的选取是一个重要的考虑因素,通常这是与开发项目的需求和应用背景相关。一般嵌入式开发工具包含用于目标系统的交叉编译器、连接器、调试器以及辅助处理用的二进制文件分析工具等。

目前可以用来编译链接产生 ARM 处理器执行代码的开发工具主要有如下几类:1. ARM 公司提供的 ARM Developer Suite 集成开发环境主要工具有 armasm、armcc、armlink、fromelf 等。

2. GNU 组织提供的 tool chain for arm主要工具有 arm-elf-gcc、arm-elf-gdb、arm-elf-objcopy 等3. Microsoft公司提供的 eMbedded Visual Tools主要工具有 clarm、clthumb、c2_arm、link、lib等这里我们选用 ARM 公司提供的 ADS 下的工具集来编译我们的程序和链接目标代码并最终生成可执行的二进制映像。这里介绍一下主要会用到的一些工具:armasm.exe : 汇编文件编译器armcc.exe : C 文件编译器armlink.exe : 目标文件连接器fromelf.exe : 用于将 axf 或者 elf 格式转换成其他格式的文件,例如二进制映像。

armprof.exe : 对调试过程中生成的 profiling 记录文件做分析用的工具软件启动代码由于板子的 0x0 地址处是 32M 的Flash ROM,因此在板子加电后,会从 Flash 中顺序执行启动代码。为了能使得mC/OS-II 运行,启动代码需要完成如下工作:1. 设置 异常向量表,即在 0x0-0x1c 位置放置7条跳转指令(其中 0x14 为空)

2.分别实现每种异常的处理程序,其中包括 Reset_Handler、Undefined_Handler、SWI_Handler、Prefetch_Handler、Abort_Handler、IRQ_Handler、FIQ_Handler. 3. 程序从 Reset_Handler 进入后,需要首先进行相关硬件的初始化操作,例如 初始化SDRAM、CPU speed、Interrupt Controller、UART、timer 等。

4. 建立每种异常状态下的系统堆栈,为了简单起见可以只在 svc 态 和 irq 态下建立堆栈:setup_svc_stack,setup_irq_stack. 5. 强制 arm 处理器状态转换为 svc 管理态。

6. 跳转到mC/OS-II 代码的 main 入口,实际上是编译链接后产生的 __main 入口。

时钟与中断处理时钟控制逻辑在图1中,有4种和系统时钟相关寄存器,它们的含义如下:● OSCR: 一个自动递增计数的 32 位计数器。

● OSMR3-0: 4 个 32 位的匹配寄存器,当 OSCR 的值匹配时产生中断。

● OSSR: 状态寄存器,当 OSCR 和 OSMR 匹配时,会对 OSSR 做标志。

● OIER: 使能寄存器,表示当匹配发生时,允许在 OSSR 设置一个标识位。

OSCR 在自动累加的过程中,与OSMR里面设定的那些匹配寄存器进行匹配,发现有匹配的事件时,就会对 OSSR 中的相应位置设一个标志位“1”,表示OSCR与对应的OSMR 发生了匹配。当然这个匹配发生的前提是发生匹配的那个OSMR在OIER中的相应位被使能,否则OSMR中的设置将不起作用。

系统时钟初始化流程mC/OS-II 中创建的第一个任务将负责启动时钟节拍,时钟的初始化设置流程如下:1) 设置 OSMR0 = x ,表示 初始化 OSMR0,即当计数器为x时发生匹配2) 设置 OSSR = 0xf ,表示 清除所有已经发生的匹配,写“1”清除3) 设置 OIER = OIER_EO ,表示 使能 OSMR0 来产生匹配4) 设置 OSCR = 0 ,表示 初始化计数器的开始值 为 0系统时钟中断复位1) 清除 OSSR 中的相应位,即向发生匹配的OSMR的那个对应位写“1”

2) 设置 OSCR = 0 ,表示 继续初始化计数器的值为 0中断控制器相关的寄存器● ICPR: 中断标示寄存器,表示了当前系统正处于激活状态的中断源。

● ICMR: 中断屏蔽寄存器,用来屏蔽相应位的中断。

● ICLR: 中断级别设置寄存器,设定报告中断的级别是 IRQ 或者是 FIQ .● ICIP: IRQ 级别的中断源寄存器,用来标识 IRQ 中断发生的源设备。

● ICFP: FIQ 级别的中断源寄存器,用来标识 FIQ 中断发生的源设备。

中断控制器初始化流程1) 设置 ICMR 屏蔽位为不屏蔽时钟中断 OSMR0 (相应位写“1”)

2) 设置 ICLR 为都报告为 IRQ 级别(所有位写“0”)

移植工作总结难点分析移植mC/OS-II 到 StrongARM 的芯片上,基本上和移植到 ARM7 的芯片例如S3C4510,AT91x等工作类似,因为所有的ARM处理器都共享arm通用的基础体系结构,这使得移植工作变得相对简单,其中绝大部分工作都集中在 os_cpu_a.S 文件的移植,这个文件的实现集中体现了所要移植到处理器的体系结构和mC/OS-II 的移植原理;在这个文件里,最困难的工作主要是在 OSIntCtxSw 和 OSTickISR 这两个函数的实现上。因为它们的实现是和移植者的移植思路以及相关硬件定时器、中断寄存器的设置有关。在实际的移植工作中,这两个地方也是比较容易出错的地方。

OSIntCtxSw 最重要的作用就是它完成了在中断ISR中直接进行任务切换,从而提高了实时响应的速度。它发生的时机是在 ISR 执行到 OSIntExit 时,如果发现有高优先级的任务因为等待的 time tick 到来获得了执行的条件,这样就可以马上被调度执行,而不用返回被中断的那个任务之后再进行任务切换,因为那样的话就不够实时了。

实现 OSIntCtxSw 的方法大致也有两种情况:一种是通过调整 sp 堆栈指针的方法,根据所用的编译器对于函数嵌套的处理,通过精确计算出所需要调整的 sp 位置来使得进入中断时所作的保存现场的工作可以被重用。这种方法的好处是直接在函数嵌套内部发生任务切换,使得高优先级的任务能够最快的被调度执行。但是这个办法需要和具体的编译器以及编译参数的设置相关,需要较多技巧。

另一种是设置需要切换标志位的方法,在 OSIntCtxSw 里面不发生切换,而是设置一个需要切换的标志,等函数嵌套从进入OSIntExit => OS_ENTER_CRITICAL() => OSIntCtxSw() => OS_EXIT_CRITICAL() => OSIntExit退出后,再根据标志位来判断是否需要进行中断级的任务切换。这种方法的好处是不需要考虑编译器的因素,也不用做计算,但是从实时响应上不是最快,不过这种方法实现起来比较简单。

在中断态下进行任务切换,需要特别说明的一个问题是如何获得被中断任务的 lr_svc .因为进入中断态后,lr 变成了lr_irq ,原来任务的 lr_svc 无法在中断态下获得,这样要得到lr_svc,就必须在中断 ISR 里面进行一次cpu mode强制转换,即对CPSR赋值为0x000000d3,只有返回到svc态之后才能得到 原来任务的lr,这个对于任务切换很重要。还有一个需要留意的问题是在强制CPSR变成svc态之后,SPSR 也会相应地变成 SPSR_irq,这样就需要在强制转变之前保存 SPSR ,也就是被中断任务中断前的 CPSR .移植中使用的编程技巧ADS 编译器在编译 C 语言的程序时,如果程序中使用了 main 函数,则编译器将自动添加如下代码,完成初始化堆栈和C库等工作,工作流程如下:1> 将执行文件中的 RO 段和 RW 段从 load address 复制到 execution address 2> 初始化 ZI 区域,用 0 来初始化变量3> 跳转到 __rt_entry 执行如下 4 个调用3.1> 调用 __rt_statckheap_init ,建立程序的堆和栈3.2> 调用 __rt_lib_init ,初始化程序用到的 C 库,并为 main 传递参数3.3> 调用 main ,即用户程序的入口3.4> 调用 exit因为系统复位后,在启动代码中已经设置了系统堆栈,同时也不需要使用C库,因此可以从 __rt_entry 处直接跳转到mC/OS-II 的代码中,即直接执行 main 函数,可以用新的 __rt_entry 来作为链接的目标入口。[!--empirenews.page--]

IMPORT main EXPORT __rt_entry __rt_entry b main这样在启动代码的最后,加入一条跳转语句:bl __main __main 入口是用户程序执行的真正入口,我们利用 armCC 编译 C 里面的 main 入口以求得到 1> 和 2> 的代码,使得可以支持全局变量。否则的话,必须自己来实现全局变量的初始化或者把这些初始化操作放到函数内部来实现。

另外一个非常有用的编程技巧是通过串口实现自己的 printf 输出。 如果使用armCC编译器的 semihosting 的话,会把 printf 通过 target 的 swi 0x123456 输出。如果已经实现的 serial_putchar 之类的函数,那么可以用它来实现 fputc 接口,也就是低级的输出函数,这样就可以使用 printf 来输出了,详细的做法在 ADS 安装目录下面的文档里可以找到,这里就不再赘述。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭