大神万字总结:嵌入式C语言必学重点……
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
......
typedef signed int int32_t;
printf("int size:%d, short size:%d, char size:%d\n", sizeof(int), sizeof(char), sizeof(short));
char *p;
printf("point p size:%d\n", sizeof(p));
//main.c#include <stdio.h>#include <stdlib.h>
static int st_val; //静态全局变量 -- 静态存储区
int ex_val; //全局变量 -- 静态存储区int main(void)
{
int a = 0; //局部变量 -- 栈上申请
int *ptr = NULL; //指针变量
static int local_st_val = 0; //静态变量
local_st_val += 1;
a = local_st_val;
ptr = (int *)malloc(sizeof(int)); //从堆上申请空间
if(ptr != NULL)
{
printf("*p value:%d", *ptr);
free(ptr);
ptr = NULL;
//free后需要将ptr置空,否则会导致后续ptr的校验失效,出现野指针
}
}
LD_ROM 0x00800000 0x10000 { ;load region size_regionEX_ROM 0x00800000 0x10000 { ;load address = execution address(RESET, +First)*(InRoot$$Sections)(+RO)}EX_RAM 0x20000000 0xC000 { ;rw Data(+RW +ZI)}EX_RAM1 0x2000C000 0x2000 {.ANY(MySection)}EX_RAM2 0x40000000 0x20000{.ANY(Sdram)}}int a[10] __attribute__((section("Mysection")));int b[100] __attribute__((section("Sdram")));
int main(void){char cval[] = "hello";int i;int ival[] = {1, 2, 3, 4};int arr_val[][2] = {{1, 2}, {3, 4}};const char *pconst = "hello";char *p;int *pi;int *pa;int **par;p = cval;p++; //addr增加1pi = ival;pi+=1; //addr增加4pa = arr_val[0];pa+=1; //addr增加4par = arr_val;par++; //addr增加8for(i=0; i<sizeof(cval); i++){printf("%d ", cval[i]);}printf("\n");printf("pconst:%s\n", pconst);printf("addr:%d, %d\n", cval, p);printf("addr:%d, %d\n", icval, pi);printf("addr:%d, %d\n", arr_val, pa);printf("addr:%d, %d\n", arr_val, par);}/* PC端64位系统下运行结果0x68 0x65 0x6c 0x6c 0x6f 0x0pconst:helloaddr:6421994, 6421995addr:6421968, 6421972addr:6421936, 6421940addr:6421936, 6421944 */
typedef struct{int b;int a;}STRUCT_VAL;static __align(4) char arr[8] = {0x12, 0x23, 0x34, 0x45, 0x56, 0x12, 0x24, 0x53};int main(void){STRUCT_VAL *pval;int *ptr;pval = (STRUCT_VAL *)arr;ptr = (int *)&arr[4];printf("val:%d, %d", pval->a, pval->b);printf("val:%d,", *ptr);}//0x45342312 0x53241256//0x53241256
typedef int (*pfunc)(int, int);int func_add(int a, int b){return a+b;}int main(void){pfunc *func_ptr;*(volatile uint32_t *)0x20001000 = 0x01a23131;func_ptr = func_add;printf("%d\n", func_ptr(1, 2));}
typedef enum {spring=1, summer, autumn, winter }season;
season s1 = summer;
typedef union{char c;short s;int i;}UNION_VAL;UNION_VAL val;int main(void){printf("addr:0x%x, 0x%x, 0x%x\n",(int)(&(val.c)), (int)(&(val.s)), (int)(&(val.i)));val.i = 0x12345678;if(val.s == 0x5678)printf("小端模式\n");elseprintf("大端模式\n");}/*addr:0x407970, 0x407970, 0x407970小端模式*/
int data = 0x12345678;short *pdata = (short *)&data;if(*pdata = 0x5678)printf("%s\n", "小端模式");elseprintf("%s\n", "大端模式");
typedef int (*pfunc)(int, int); typedef struct{ int num; int profit; pfunc get_total; }STRUCT_VAL; int GetTotalProfit(int a, int b){ return a*b; }
int main(void){ STRUCT_VAL Val; STRUCT_VAL *pVal; Val.get_total = GetTotalProfit; Val.num = 1; Val.profit = 10; printf("Total:%d\n", Val.get_total(Val.num, Val.profit)); //变量访问 pVal = &Val; printf("Total:%d\n", pVal->get_total(pVal->num, pVal->profit)); //指针访问 } /* Total:10 Total:10 */
typedef unsigned char uint8_t; union reg{ struct{ uint8_t bit0:1; uint8_t bit1:1; uint8_t bit2_6:5; uint8_t bit7:1; }bit; uint8_t all; };
int main(void){ union reg RegData; RegData.all = 0; RegData.bit.bit0 = 1; RegData.bit.bit7 = 1; printf("0x%x\n", RegData.all); RegData.bit.bit2_6 = 0x3; printf("0x%x\n", RegData.all); } /* 0x81 0x8d*/
union DATA{ int a; char b; }; struct BUFFER0{ union DATA data; char a; //reserved[3] int b; short s; //reserved[2] }; //16字节 struct BUFFER1{ char a; //reserved[0] short s; union DATA data; int b; };//12字节
int main(void) { struct BUFFER0 buf0; struct BUFFER1 buf1; printf("size:%d, %d\n", sizeof(buf0), sizeof(buf1)); printf("addr:0x%x, 0x%x, 0x%x, 0x%x\n", (int)&(buf0.data), (int)&(buf0.a), (int)&(buf0.b), (int)&(buf0.s)); printf("addr:0x%x, 0x%x, 0x%x, 0x%x\n", (int)&(buf1.a), (int)&(buf1.s), (int)&(buf1.data), (int)&(buf1.b)); } /* size:16, 12 addr:0x61fe10, 0x61fe14, 0x61fe18, 0x61fe1c addr:0x61fe04, 0x61fe06, 0x61fe08, 0x61fe0c */
printf("error loop\n");\ }while(0);int global(v) = 10;int global(add)(int a, int b){ return a+b;}
struct TestA{ char i; int b;}A;等同于 struct _TestB{ char i; int b; }__attribute__((packed))A;
扫码|关注EET官方社区
发送“学习资料包”或技术关键词,领取超100G技术资料
