【归纳】C语言代码编写规范——ARM

目录:
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;
}//运行成功




猜你喜欢

转载自blog.csdn.net/weixin_39420903/article/details/80144672