【归纳】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、<gui457086306@qq.com> 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;
}//运行成功




1 排版规则 1) 程序应采用缩进风格编写,每层缩进使用一个制表位(TAB),类定义、方法都应顶格书写; 2) 源程序建议使用英文书写,尽量不含有中文。每行不超过80字符。对于较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读;循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分; 3) 左花括号要另起一行,不能跟在上一行的行末; 4) 一个变量定义占一行,一个语句占一行; 5) 对独立的程序块之间、变量说明之后必须加空行; 6) 在结构成员赋值等情况,等号对齐,最少留一个空格; 7) 若函数或过程中的参数较长,则要进行适当的划分。 8) 形参的排序风格:  最常使用的参数放在第一位;  输入参数列表应放在输出参数列表的左边;  将通用的参数放在特殊的参数的左边。 2 命名规范 2.1 应用程序的命名 “系统简称”+模块名称 2.2 子模块的命名 每个子模块的名字应该由描述模块功能的1-3以单词组成。每个单词的首字母应大写。在这些单词中可以使用一些较通用的缩写。 2.3 变量的命名 变量的命名的基本原则是使得变量的含义能够从名字中直接理解。可以用多个英文单词拼写而成,每个英文单词的首字母要大写,其中英文单词有缩写的可用缩写;变量的前缀表示该变量的类型;对于作用域跨越10行以上的变量名称不能少于4个字符,除循环变量,累加变量外不得使用I、j、k等名称的变量。变量分为取全局变量和局部变量,对于全局变量以加前缀“g_”来区分。 使用有意义的英语单词,使用大小写分隔,每个单词的第一个字母为大写 标识符种类 书写规范 示 例 函数/过程名/变量 一般标识符 CheckButtonStates 宏标识符 大写标识符 SALES_TAX 类型定义 ‘T’+一般标识符 TMyType 类标识符 ‘C’+一般标识符 CEditBox 结构标识符 ‘S’+一般标识符 SMyStructure 联合标识符 ‘U’+一般标识符 UMyUnion 字符标识符 ‘c’+一般标识符 cReadKey 字符串标识符 ‘s’+一般标识符 sComputerName 整数标识符 ‘i/ui/l/ul’+一般标识符 iNumber, ulCurrent 浮点型标识符 ‘f/d’+一般标识符 fPrice,dMoney 逻辑标识符 ‘b’+一般标识符 bIsDetailed 对象标识符 特征小写字母+一般标识符 fMyStatus, tMyTree 指针变量 p+类型前缀+一般标识符 piCount 全局变量 g+类型前缀+一般标识符 giCount 类私有变量 f+类型前缀+一般标识符 fiCount 数据库变量 以m打头 miCount 考虑到习惯性和简洁性,对于按常规使用的局部变量允许采用极短的名字,如用n、i作为循环变量,p、q作为指针等。另外,要注意的是:全局变量在程序中不要定义太多,能用局部变量的就用局部变量。如果要使用相关的变量,建议采用类的方式或者结构的方式存放,以减少具体变量的个数。 2.4 常量的命名 常量所有的字母均为大写。并且单词之间使用下划线”_”隔开。 2.5 函数/过程的命名 函数/过程名称应该尽量使用能够表达函数功能的英文名称,函数名称中应该禁止使用如同function1,function2等含义不清的名称。单词间应该使用大小写分隔。全局函数/过程名称以“g_”前缀开始。 2.6 接口命名 接口名称要以大写字母开头。如果接口包含多个单词,每个单词的首字母大写,其他字母小写,如果,这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写为Xml)。 2.7 类的命名 类名称要以大写字母开头; 类名称如果包含多个单词,每个单词的首字母要大写,其他字母小写;如果这些单词是缩略语(例如XML),也要首字母大写,其他字母小写(写作Xml); 类名称应该是一个名词或名词短语; 类成员变量的命名规则与上述规则相同,但是要以“m_”开始,表示其为成员变量(Member); 类名称不能出现下划线。 2.8 方法的命名
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值