嵌入式armc语言
⑴ ARM用什么写程序,是C++吗,还是C
一般ARM的底层开发还是用c语言和汇编语言多一些;如果有操作系统如linux和WinCE等,那么底层还是用C和汇编,上层应用软件一般使用C++或Java
⑵ ARM和嵌入式的解释
ARM既是一个公司,又类一个芯片名称还是一个结构
一般我们所说的嵌入式是指在日常应用中将一些微处理器芯片搭建而成的消费电子等一些列产品的技术,可以是用单片机,但目前随着随着ARM芯片的规模化生产,价格进一步降低,故越来越多的企业应用ARM芯片,ARM芯片可以跑裸机即为不装操作系统当做单片机一样来使用,但其处理速度和内存远远超过单片机。但装有操作系统是可以看作是一个微型电脑的CPU,实现的功能就同我们的电脑一样。所谓的嵌入式开发是指基于ARM等一些列芯片的研发,比如硬件电路的搭建,底层驱动的编写和应用软件的编写等。其开发环境平台有很多,比如有微软的WINCE,Linux只是其中的一种,由于linux操作系统是开源的就是不收取专利费用,而且内核所占用的空间少,所以大多数厂商都是基于linux操作系统来开发新产品。
当将操作系统装载在ARM芯片上是就可以在此基础上写应用软件。
可以用C/C++开发,linux内核就是用C语言编写的,所以应用程序就的用linu下的C语言来编写。所以要学习linux嵌入式开发首先的学号c语言。在linux操作环境下Qt应用同C++类似,面相对象的语言,可以变出人机界面。
⑶ 嵌入式 arm 汇编 C语言 我看一个工程文件的.c文件中有一个标示符的宏定义------问题如下。一定采纳,跪求
如果你没有看错的话, 因该是产生警告的,但是这不是错误,是可以编译通过的, 而且你实际调用的宏应该是这个.c 文件中的宏定义. 如果在你编译的时候, 关闭了警告提示, 那么编译器就不会提示这个问题.可能keil的编译器忽略了此类问题,这是有可能的.
⑷ arm编程,c语言中嵌入汇编实现1+2+3+...+100
C语言中static关键字的常见用法及举例
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,
C++已经有相应的编译器,但是现在使用还是比较少的。在稍大
规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编
写的,主要是因为C语言的结构比较好,便于人的理解,而且有
大量的支持库。尽管如此,很多地方还是要用到汇编语言,例如
开机时硬件系统的初始化,包括CPU状态的设定,中断的使能,
主频的设定,以及RAM的控制参数及初始化,一些中断处理方
面也可能涉及汇编。另外一个使用汇编的地方就是一些对性能非
常敏感的代码块,这是不能依靠C编译器的生成代码,而要手工
编写汇编,达到优化的目的。而且,汇编语言是和CPU的指令集
紧密相连的,作为涉及底层的嵌入式系统开发,熟练对应汇编语
言的使用也是必须的。
单纯的C或者汇编编程请参考相关的书籍或者手册,这里主要讨
论C和汇编的混合编程,包括相互之间的函数调用。下面分四种
情况来进行讨论,暂不涉及C++。
1. 在C语言中内嵌汇编
在C中内嵌的汇编指令包含大部分的ARM和Thumb指令,不过其
使用与汇编文件中的指令有些不同,存在一些限制,主要有下面
几个方面:
a. 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令
b. 在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突
c.
R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器
d. 一般不要直接指定物理寄存器,而让编译器进行分配
内嵌汇编使用的标记是 __asm或者asm关键字,用法如下:
__asm
{
instruction [; instruction]
…
[instruction]
}
asm(“instruction [; instruction]”);
下面通过一个例子来说明如何在C中内嵌汇编语言,
#include
void my_strcpy(const char *src, char *dest)
{
char ch;
__asm
{
loop:
ldrb ch, [src], #1
strb ch, [dest], #1
cmp ch, #0
bne loop
}
}
int main()
{
char *a = "forget it and move on!";
char b[64];
my_strcpy(a, b);
printf("original: %s", a);
printf("ed: %s", b);
return 0;
}
在这里C和汇编之间的值传递是用C的指针来实现的,因为指针
对应的是地址,所以汇编中也可以访问。
2. 在汇编中使用C定义的全局变量
内嵌汇编不用单独编辑汇编语言文件,比较简洁,但是有诸多限
制,当汇编的代码较多时一般放在单独的汇编文件中。这时就需
要在汇编和C之间进行一些数据的传递,最简便的办法就是使用
全局变量。
/* cfile.c
* 定义全局变量,并作为主调程序
*/
#include
int gVar_1 = 12;
extern asmDouble(void);
int main()
{
printf("original value of gVar_1 is: %d", gVar_1);
asmDouble();
printf(" modified value of gVar_1 is: %d", gVar_1);
return 0;
}
对应的汇编语言文件
;called by main(in C),to double an integer, a global var defined in C
is used.
AREA asmfile, CODE, READONLY
EXPORT asmDouble
IMPORT gVar_1
asmDouble
ldr r0, =gVar_1
ldr r1, [r0]
mov r2, #2
mul r3, r1, r2
str r3, [r0]
mov pc, lr
END
3. 在C中调用汇编的函数
在C中调用汇编文件中的函数,要做的主要工作有两个,一是在
C中声明函数原型,并加extern关键字;二是在汇编中用
EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最
后用mov pc, lr返回。然后,就可以在C中使用该函数了。从
C的角度,并不知道该函数的实现是用C还是汇编。更深的原因
是因为C的函数名起到表明函数代码起始地址的左右,这个和汇
编的label是一致的。
/* cfile.c
* in C,call an asm function, asm_strcpy
* Sep 9, 2004
*/
#include
extern void asm_strcpy(const char *src, char *dest);
int main()
{
const char *s = "seasons in the sun";
char d[32];
asm_strcpy(s, d);
printf("source: %s", s);
printf(" destination: %s",d);
return 0;
}
;asm function implementation
AREA asmfile, CODE, READONLY
EXPORT asm_strcpy
asm_strcpy
loop
ldrb r4, [r0], #1 ;address increment after read
cmp r4, #0
beq over
strb r4, [r1], #1
b loop
over
mov pc, lr
END
在这里,C和汇编之间的参数传递是通过ATPCS(ARM
Thumb Procere Call Standard)的规定来进行的。简单的说就
是如果函数有不多于四个参数,对应的用R0-R3来进行传递,多
于4个时借助栈,函数的返回值通过R0来返回。
4. 在汇编中调用C的函数
在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名
,然后将C的代码放在一个独立的C文件中进行编译,剩下的工
作由连接器来处理。
;the details of parameters transfer comes from ATPCS
;if there are more than 4 args, stack will be used
EXPORT asmfile
AREA asmfile, CODE, READONLY
IMPORT cFun
ENTRY
mov r0, #11
mov r1, #22
mov r2, #33
BL cFun
END
/*C file, called by asmfile */
int cFun(int a, int b, int c)
{
return a + b + c;
}
在汇编中调用C的函数,参数的传递也是通过ATPCS来实现
的。需要指出的是当函数的参数个数大于4时,要借助stack,具
体见ATPCS规范
⑸ 嵌入式c语言和c语言的异同
嵌入式编程用的最多的也是C语言,和普通的windows下的C编程不同的就是,比如应用层开发,嵌入式开发出来的应用程序最终不是要运行在PC上
的,而是目标板。所以嵌入式开发就一定会有交叉编译这个环节(简单一点理解就是,在PC下编程,然后交叉编译一下,让程序能运行在PC外的其他平台上,比
如ARM开发板什么的)
稍微做一下类比:
普通编程开发=====CPU(比如奔腾)=====windows操作系统
嵌入式开发=====嵌入式处理器(比如ARM)=====嵌入式操作系统(比如嵌入式linux、wince、vxworks等)
PC上如果没有windows操作系统,那它就是一个DOS机。
嵌入式开发中如果没有嵌入式操作系统,那它就是通常所说的单片机开发,嵌入式开发最初就是从单片机开发走过来的。
现在所说的嵌入式开发,通常都是指有嵌入式操作系统的那种,产品功能复杂了,单片机开发无法实现,需要用到嵌入式操作系统,也能体现出嵌入式操作系
统的优势。
当然现在所讲嵌入式开发和单片机开发的区别不仅仅在是否有嵌入式操作系统上,嵌入式开发所使用的嵌入式处理器(比如ARM
/
MIPS等)在内核体系结构、指令系统、工作模式等方面与单片机都有很大不同。
嵌入式产品在航空、医疗、家电、消费电子、汽车电子、移动等众多领域都可以看到,应用领域极为广泛,所以现在嵌入式开发相当热门,并且具备非常好的发展前景!!
⑹ 请问学ARM嵌入式系统需要多深入的C语言基础,要用到数据结构吗
这个问题要确实不好说,不过C语言在嵌入式系统开发中的地位是非常高的,但一开始学ARM并不需要多高的基础,但是在学ARM的过程中你必需去提高,因为在后面的工作或是你对ARM的学习要求高了,对C的要求也会高的,有程序就要用到数据结构,只是复杂或简单的问题了。
如果你是刚接触ARM的话还是可以边学边提高你的C语言水平的,建议你可以去看下国嵌或亚嵌套视频,里面都有对初学者的一些规划,希望可以帮到你!
⑺ ARM9嵌入式系统,用C语言编写7段LED数码管
//显示123456的程序,这只是整个程序片段
#include "led_ioctl.h"
int Led_123()
{
int led_fd,count;
char ret[7]; //数组ret[i] 存放送LED显示的数据
//【打开LED设备】
led_fd = open("/dev/led",O_RDWR);
if (led_fd <= 0){
printf("open led device error\n");
return 0;
}//if
ret[6] = 0xcf; //初始化数组数值为 6.
ret[5] = 0x4f; //初始化数组数值为 5.
ret[4] = 0x53; //初始化数组数值为 4.
ret[3] = 0x5d; //初始化数组数值为 3.
ret[2] = 0x9d; //初始化数组数值为 2.
ret[1] = 0x50; //初始化数组数值为 1.
ioctl(led_fd,IOCTRL_LED_1);
count = write(led_fd,ret+1,1);
ioctl(led_fd,IOCTRL_LED_2);
count = write(led_fd,ret+2,1);
ioctl(led_fd,IOCTRL_LED_3);
count = write(led_fd,ret+3,1);
ioctl(led_fd,IOCTRL_LED_4);
count = write(led_fd,ret+4,1);
ioctl(led_fd,IOCTRL_LED_5);
count = write(led_fd,ret+5,1);
ioctl(led_fd,IOCTRL_LED_6);
count = write(led_fd,ret+6,1);
return 0;
}
⑻ 嵌入式 ARM C语言
ARM指令是一个独特的指令,都是专门针对手臂,可视为一个编译
被改写汇编包括win32和AT&T,是一种计算机语言
C语言是一种计算机语言,更容易学习不是汇编
linux编程的汇编语言或C或Java短,什么都可以,但与windows编程是不一样的,在linux移植过程编译通过才能到Windows上运行,手臂董事会运行Linux 房东想让单片机,我建议你以前编程的过程中,和良好的科学的直接编译,然后手臂,那么你可以学到单片机C51的研究,用c写的,然后用汇编语言编写,熟练再联系手臂,因为手臂的学习成本太高,很多人都没有坏科学基础
⑼ ARM和DSP算是嵌入式的硬件还是软件方向编程用的是C语言吗
如你是从DSP芯片级的器件开始自己动手设计和装配成模块时这会是硬件的工作。如你购现成的嵌入式模块或用你自己 装配好的模块进行编程时就是软件的工作呢。这时你可用相关的C语言进行编程。如你想用的更好那最好也学会它的汇编级语言。
⑽ 嵌入式ARM 混合编程,汇编调用C语言,在线等
段定义前加 PRESERVE8 伪指令试一下。
前两天刚好看到 ARM UCOS 汇编代码中用到PRESERVE8这个关键字(加在段定义之前),以前没见过的,于是网络。
1.汇编代码没有保持8字节栈对齐而调用C或C++代码。
2.ADS下的代码用RVDS2.2编译时,即使已经8字节栈对齐,连接器也将之当作非8字节栈对齐。
所以要用伪指令指明一下。
E文不好,故而附原文以供参详:
where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment.