嵌入式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.