目录:
1.寄存器操作原则
1.1寄存器宏定义及调用
1.2、寄存器的错误操作用法
1.3、给寄存器赋值的方法
2.函数调用的形式
2.1.函数调用语句
2.2.函数表达式
2.3.函数参数
1.寄存器操作原则
若非必要,不要轻易改变寄存器的值!
若改变寄存器的话。读 改 写 三步。别影响其他位。
例程:
问个问题: while(!(UTRSTAT0 & (1<<2))); while(!(UTRSTAT0 &= (1<<2))); 有什么区别,第二个循环貌似会无限循环,为什么 大神们可以帮忙看下吗? Diego、<[email protected]> 2018/4/29 16:59:31 第一个只比较不改变 第二个改变了 xxxxx(8xxxxx97) 2018/4/29 17:00:35 嗯嗯,是的,第二个bit2初值不为1的话,就陷入死循环了
1.1寄存器宏定义及调用
使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义
#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)
然后就可以用C语言对这个内存地址进行读写操作了
读:tmp = RAM_ADDR;
写:RAM_ADDR = 0x55;
1.2、寄存器的错误操作用法
STR 0, 0x56000050 //error!预期寄存器,非0, 0x56000050
STR R0, R1 // 错误:内部重新定位(类型:OFFSET_IMM)没有固定
1.3、给寄存器赋值的方法
正确写法:
ldr sp, = 0x40000000 + 4096
ldr r0, =0x53000000
mov sp, #4096
mov r0, #0
错误写法:
mov sp,#(0x40000000+4096) //错误:无效的常数
mov sp,#0x40000000+4096 //错误:无效的常数
2.函数调用的形式
本段以下摘自:《谭浩强-C程序设计(第四版)-- 第7.3章调用函数》
函数调用的一般形式为: 函数名(实参表列)
如果是调用无参函数,则“实参表列”可以没有,但括号不能省略,如下例。若果实参表列包含多个实参,则各参数间用逗号隔开。
按函数调用在程序中出现的形式和位置来分,可以有以下三种函数调用方式:
2.1.函数调用语句
把函数调用单独作为一个语句。如:led_test(); 这时不要求函数带回值,只要求函数完成一定的操作。
2.2.函数表达式
函数调用出现在另一个表达式中,如:“c = max(a, b);”, max(a, b)是一次函数调用,它是赋值表达式的一部分。这时要求函数带回一个确定的值以参加表达式的运算。例:
c = 2*max(a, b);
2.3.函数参数
函数调用作为另一个函数调用时的实参。例:
m = max(a, max(b, c));
说明:调用函数并不一定要求包括分号(如printf();),只有作为函数调用语句才需要有分号。如果作为函数表达式或者函数参数,函数调用本身是不必有分号的。不能写成:
printf("%d", max(a,b); ); //错误写法,max()后面多了一个分号
正确写法:led_test(); //led_test(void);错误,以下同理
File:uart.h int led_test(void); void delay(volatile unsigned int k); void uart0_init(); int putchar(int c); int getchar(void); int puts(const char *s); FIle:main.c int main(void) { led_test(); //led_test(void);错误,以下同理 uart0_init(); puts("Hello, world!\n\r"); while(1) { c = getchar(); if(c == '\r') { putchar('\n'); } if(c == '\n') { putchar('\r'); } putchar(c); } //运行成功
#include <stdio.h> void delay(int k) //或者void delay(void) { k = 5000; while(k--); } int main(void) { delay; //或者delay();均是合理引用? int i = 5; printf("i = %d, i =%08d, i = %8d\n", i, i, i); printf("i = %02d, i =%04d, i = %06d\n", i, i, i); printf("i = %010d, i =%012d, i = %014d\n", i, i, i); printf("i = %#d, i =%#o, i = %#x\n", i, i, i); printf("i = %#d, i =%#8o, i = %#8x\n", i, i, i); printf("i = %#0d, i =%#08o, i = %#08x\n", i, i, i); printf("i = %#0d, i =%#012o, i = %#012x\n", i, i, i); return 0; }//运行成功