1. 嵌入式系統中斷服務子程序(ISR) c++
中斷是嵌入式系統中重要的組成部分,這致使了很 多編譯開發商提供一種擴展—讓標準C支持中斷。具表明事實是,產生了一個新的關鍵字 __interrupt。下面的代碼就使用了__interrupt關鍵字去定義了一箇中斷服務子程序(ISR),請評論一下這段代碼的。數組
__interrupt double compute_area (double radius)多線程
{ double area = PI * radius * radius;函數
printf(" Area = %f", area);性能
return area;ui
}spa
1). ISR 不能返回一個值。線程
2). ISR 不能傳遞參數。指針
3). 在許多的處理器/編譯器中,浮點通常都是不可重入的。有些處理器/編譯器須要讓額處的寄存器入棧,有些處理器/編譯器就是不容許在ISR中作浮點運算。此外,ISR應該是短而有效率的,在ISR中作浮點運算是不明智的。code
4). 與第三點一脈相承,printf()常常有重入和性能上的問題。
2.C語言中對位的操做,好比對a的第三位清0,第四位置1.原本應該會的,一犯暈寫反了,之後注意!
#define BIT3 (1<<3)
#define BIT4 (1<<4)
a &= ~BIT3; a |= BIT4;
3.volatile
表示這個變量會被意想不到的改變,每次用他的時候都會當心的從新讀取一遍,不適用寄存器保存的副本。
volatile表示直接存取原始地址
例:
並行設備的硬件寄存器(狀態寄存器)
在多線程運行的時候共享變量也要時時更新
一箇中斷服務子程序中訪問到的的非自動變量(定義變量時默認爲自動變量,這裏指全局變量或加修飾的變量)
4.Const:
Const char*p //p 指向的內容不能被修改
Char const *p; // p指針指向內容不能修改
Const (char*) p; //p指針不能修改,p++ 操做會出錯
Const type fun(); // 返回值類型爲一個const type類型,不能修改
Fun( const char *p); //保護指針,引用傳遞的值不被修改.
類成員函數:中 fun() const; //代表FUN不能修改爲員變量,不調用非const 成員函數.
5.要求設置一絕對地址爲0x67a9 的整型變量的值爲0xaa66
int *ptr = (int *)0x67a9;
*ptr = 0xaa66;
六、
#include "stdio.h"
int a=0;
int b;
static char c;
int main(int argc,char *argv[])
{
char d=4;
static short e;
a++;
b=100;
c=(char)++a;
e=(++d)++;
printf("a=%d, b=%d, c=%d, d= %d, e=%d",a,b,c,d,e);
return 0;
}
a) 寫出程序輸出
答案:a = 2, b = 100, c = 2, d = 6, e = 5
7a)對於整形變量A=0x12345678,請畫出在little endian及big endian的方式下在內存中是如何存儲的?
little endian big endian 恰好反過來
高地址--〉 0x12 低地址--〉 0x12
0x34 0x34
0x56 0x56
低地址--〉 0x78 高地址--〉 0x78
記憶方法:
小端模式 : 地址的增加順序與值的增加順序相同(x86爲小端模式)
大端模式 : 地址的增加順序與值的增加順序相反
b)在ARM系統中,函數調用的時候,參數是經過哪一種方式傳遞的?
參數<=4時候,經過R0~R3傳遞,>4的經過壓棧方式傳遞
8 .1請實現內存複製函數void* memcpy(void* dst, void* src, int count)。
1 #include <stdio.h> 2 #include <assert.h> 3 void* mem_cpy(void *dst, const void *src, int count) //參數定義爲空指針類型,而且源地址內容不該該被改變,所以用const修飾 4 { 5 /* 6 if(NULL==dst || NULL==src) 7 return dst; 8 */ 9 assert(dst); //若傳入參數不爲真,程序退出 10 assert(src); 11 while(count--) 12 { 13 *(char*)dst = *(char*)src; //強制轉化爲字符指針類型,並進行內容複製 14 dst = (char*)dst +1; 15 src = (char*)src +1; 16 } 17 return dst; 18 } 19 20 int main(int argc, char* argv[]) 21 { 22 char From[100] ="Hello baby!"; 23 char To[100] = {0}; 24 mem_cpy(To,From,100); //前兩個參數位子不要弄錯 25 printf("%s\n",From); //輸出字符串 26 printf("%s\n",To); 27 return 0; 28 29 }
精簡版
1 char * strcpy(char * strDest,const char * strSrc) 2 { 3 char * strDestCopy=strDest; 4 assert( (strDest!=NULL) && (strSrc!=NULL) ); // #include <assert.h> 5 6 while ((*strDest++=*strSrc++)!='\0'); 7 return strDestCopy; 8 }
8.二、不使用庫函數,編寫函數int strcmp(char *source, char *dest)相等返回0,不等返回-1;
1 #include "stdafx.h" 2 #include <assert.h> 3 #include <string.h> 4 5 int strcmp(char *source, char *dest) 6 { 7 8 int i; 9 assert((NULL != source)&&(NULL != dest)); //判斷指針是否爲空 10 if(strlen(source) != strlen(dest)) //判斷兩字符串長度時候相等,不相等確定不相等,直接退出 11 { 12 return -1; 13 } 14 for(i = 0;i < strlen(source);i++) //利用指針,將兩字符串逐字比較 15 { 16 if(*(source + i) != *(dest + i)) //若是不相等,退出 17 return -1; 18 } 19 20 return 0; 21 } 22 23 int main(int argc, char* argv[]) 24 { 25 static char a[2][10]; //定義一個二維數組 26 int N; 27 printf("input two string\n"); 28 for(int i=0;i<2;i++) 29 { 30 scanf("%s",&a[i][0]); //輸入兩個字符串 31 } 32 33 N=strcmp(&a[0][0],&a[1][0]); //調用自定義函數 34 if(N == -1) 35 printf(" two different string\n"); 36 else 37 printf("same string\n"); 38 return 0; 39 }
9.一、在數組定義int a[2][2]={{3},{2,3}};則a[0][1]的值爲0。(對)
9.二、
1 #include <stdio.h> 2 in tmain(int argc,char * argv[]) 3 { 4 int a [3][2]={(0,1),(2,3),(4,5)}; 5 int *p; 6 p=a [0]; 7 printf("%d",p[0]); 8 }
問打印出來結果是多少?
答案:1.
分析:花括號裏嵌套的是小括號而不是花括號!這裏是花括號裏面嵌套了逗號表達式!其實這個賦值就至關於int a [3][2]={ 1, 3, 5};
10.0 輸入任意字符串,打印輸出其逆序:
1 #include "stdafx.h" 2 #include<stdio.h> 3 #include <stdlib.h> 4 #include<string.h> 5 6 void s_back(char *p) 7 { 8 int i=0; 9 char *ps; 10 char *pe; 11 char temp; 12 if(!p) 13 return; 14 ps=p; 15 while(*p!=0) 16 p++; //最後一個字符知足要求,p++後指針指向了字符串外的一個地址; 17 pe=p; 18 19 for(i=0;i<(pe-ps)/2;i++) 20 { 21 temp=*(ps+i); 22 *(ps+i)=*(pe-i-1); //因爲pe指向的是字符串外的一個地址,所以這裏還必須減一 23 *(pe-i-1)=temp; 24 } 25 } 26 27 int main(void) 28 { 29 printf("input:"); 30 char *p=(char *)malloc(10); 31 scanf("%s",p); 32 33 s_back(p); 34 printf("output:%s\n",p); 35 free(p); 36 return 0; 37 }
十一、寫一函數int fun(char *p)判斷一字符串是否爲迴文,是返回1,不是返回0,出錯返回-1
1 #include "stdafx.h" 2 #include <assert.h> 3 #include <string.h> 4 5 int fun(char *p) 6 { 7 int len; 8 if(NULL == p) //檢測指針是否有效 9 return -1; 10 len=strlen(p)-1; printf("len = %d\n",len); 11 for(int i=0;i<(len/2);i++) 12 { 13 printf("*(p+%d)=%c\n *(p+len-%d)=%c\n",i,*(p+i),i,*(p+len-i-1)); 14 if(*(p+i) != *(p+len-i-1)) //判斷首尾是否依次相等,便是否爲迴文 15 return 0; //不是迴文返回0 16 } 17 return 1; //是迴文返回1 18 19 20 } 21 22 int main(int argc, char* argv[]) 23 { 24 int R; 25 char ch[]="abcdedcba"; 26 R=fun(ch); 27 switch (R) 28 { 29 case -1: 30 printf("error!\n"); 31 break; 32 case 0: 33 printf("it's not huiweng\n"); 34 break; 35 case 1: 36 printf("it's huiweng\n"); 37 break; 38 default: 39 break; 40 } 41 return 0; 42 }