每日一题(十一)
10.16 ARM子程序设计及调用涉及的指令
在ARM汇编语言程序设计中,经常用到子程序设计及调用,与子程序设计与调用无关的指令或伪指令是( )。
A.BL SerchMin
B.IMPORT SerchMin
C.MOV PC,LR
D.B SerchMin
答案是:D
- A:子程序调用一般通过BL命令实现。
- B:IMPORT是伪指令,用于通知编译器要使用的标号在其他的源文件中定义,需要在当前源文件中引用。
- C:MOV PC,LR 是在子程序返回时的跳转。
所以选D
10.17 JTAG调试技术
下面有关片上调试技术的描述语句中,不恰当的是( )。
A.边界扫描技术是调试硬件芯片及目标机电路板的一种常用调试技术
B.JTAG组织所研究的测试访问端口和边界扫描结构标准,成为了片上测试技术的一种国际标准,即俗称的JTAG标准
C.使用片上调试技术进行嵌入式系统目标机调试时,无需目标存储器,也不占用目标机任何I/O端口
D.经常用于嵌入式系统设计中的微处理器(如:MCS-51、DSP、ARM)都支持JTAG标准的片上调试技术
答案是:D
- A:边界扫描测试技术是对芯片或印制电路板进行片上调试最常用的一种技术。
- B:JTAG是IEEE下的一个组织,研究测试访问端口和边界扫描结构的标准,其研究结果俗称JTAG标准。
- C:使用JTAG进行嵌入式系统的调试,无需目标存储器,也不占用目标机任何I/O端口。
- D:MCS-51单片机不支持JTAG调试标准,其软件固化要使用称为“编程器”的设备来进行。
JTAG(Joint Test Action Group,联合测试工作组)是一种国际标准测试协议(IEEE 1149.1兼容),主要用于芯片内部测试。现在多数的高级器件都支持JTAG协议,如DSP、FPGA器件等。标准的JTAG接口是4线:TMS、TCK、TDI、TDO,分别为模式选择、时钟、数据输入和数据输出线。
一个含有JTAG Debug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备,如FLASH,RAM,SOC(比如4510B,44Box,AT91M系列)内置模块的寄存器,像UART,Timers,GPIO等等的寄存器。
仿真器是用以实现硬件仿bai真的硬件。仿真器可以du实现替代单片机、zhiARM对程序dao的运行进行控制,例如单步,全速,查看资源断点等。尽管软件仿真具有无需搭建硬件电路就可以对程序进行验证的优点,但无法完全反映真实硬件的运行状况,因此还要通过硬件仿真来完成最终的设计。 目前的开发过程中硬件仿真是必需的。
JTAG和J-LINK是两种仿真器 二者选其一就可以了
Jlink仿真需要自己的软件,但是支持的芯片多一点;
而JTAG不需要专业的软件,但是支持的芯片少一点。
使用集成开发环境配合 JTAG 仿真器进行开发是目前采用最多的一种调试方式。
10.18 ARM内核处理器区别
以下关于ARM处理器内核说法正确的是( )。
A.经典ARM处理器包括Cortex-M、Cortex-R和Cortex-A三大类
B.Cortex-A系列为应用Cortex处理器,主要面向高端应用设计
C.Cortex-M系列为面向控制领域的实时嵌入式处理器
D.ARM11性能优于Cortex-A5,但低于Cortex-A15
答案是:B
ARM公司在经典处理器ARM11以后的产品改用Cortex来命名,将Cortex分为A、R和M三种类型,Cortex系列属于ARMv7架构,这是ARM公司最新的指令集架构,而我们比较熟悉的三星的S3C2410芯片是ARMv4架构,ATMEL公司的AT91SAM9261芯片则是ARMv5架构。ARM在最初的处理器型号都用数字命名,最后一个是ARM11系列,在应用ARMv7架构后,推出了Cortex这一系列,老式的则命名为Classic系列。
ARMv7架构定义了三大分工明确的系列:
- Cortex-A:基于v7A架构,面向尖端的基于虚拟内存的操作系统和用户应用
- Cortex-R:基于v7R架构,针对实时系统
- Cortex-M:基于v7M架构,针对微控制器和低成本应用提供优化
ARMv7架构是在ARMv6架构的基础上诞生的。该架构采用了Thumb-2技术,Thumb-2技术是在ARM的Thumb代码压缩技术的基础上发展起来的,并且保持了对现存ARM解决方案的完整的代码兼容性。Thumb-2技术比纯32位代码少使用 31%的内存,减小了系统开销。同时能够提供比已有的基于Thumb技术的解决方案高出38%的性能。ARMv7架构还采用了NEON技术,将DSP和媒体处理能力提高了近4倍,并支持改良的浮点运算,满足下一代3D图形、游戏物理应用以及传统嵌入式控制应用的需求。此外,ARMv7还支持改良的运行环境,以迎合不断增加的JIT(Just In Time)和DAC(DynamicAdaptive Compilation)技术的使用。另外,ARMv7架构对于早期的ARM处理器软件也提供很好的兼容性。
ARM7:ARMv4架构,ARM9:ARMv5架构,ARM11:ARMv6架构,ARM-Cortex 系列:ARMv7架构 ARM7没有MMU(内存管理单元),只能叫做MCU(微控制器),不能运行诸如Linux、WinCE等这些现代的多用户多进程操作系统, 因为运行这些系统需要MMU,才能给每个用户进程分配进程自己独立的地址空间 。
参考链接:https://zhuanlan.zhihu.com/p/92315825
10.19 main的参数
ANSI-C(美国国家标准协会,C的第一个标准ANSI发布)在C89/C99\中main()函数主要形式为:
int main(void);
int main(int argc, char *argv[]);
其中的int main(int argc, char *argv[])
两个参数的作用如下:
- argc:argument count,表示参数传入的个数
- argv[]:表示传入main的参数的指针,第一个参数argv[0]是程序运行时的路径名,从argv[1]开始才是传入的参数
通过程序验证一下:
#include "stdio.h"
int main(int argc, char *argv[])
{
int i;
printf("argc is :%d\n", argc);
for (i = 0; i < argc; i++) {
printf("argv[%d] is :%s\n", i, argv[i]);
}
return 0;
}
结果:
gq@gq-virtual-machine:~/learn/code/c$ ./a first 4562 asdf 0x12
argc is :5
argv[0] is :./a
argv[1] is :first
argv[2] is :4562
argv[3] is :asdf
argv[4] is :0x12
参数可以在可执行文件之后直接加上。
10.20 C中static与C++中static的不同
C语言中:static用来修饰局部变量和全局变量,以及函数
C++中:static还可以用来修饰类的成员变量和函数,即静态成员和静态函数
C++中的静态成员可以在多个对象间进行通信,传递信息,即同一类中的static修饰的静态变量和成员函数一样,都是被各个对象公用的。