AVR笔记6:C语言优秀编程风格
AVR c语言优秀编程风格
文件结构
这个工程中有8个文件,一个说明文件,如下图:下载程序例子avrvi.com/down.php?file=examples/motor_control.rar">电机控制案例。
- 所有.c文件都包含了config.h文件。如: #include "config.h"
- 在config.h 中有如下代码:
#include "delay.h" #include "device_init.h" #include "motor.h"
- 这样做就不容易出现错误的包含关系,为了预防万一,我们还引入了宏定义与预编译。如下:
#ifndef _UNIT_H__ #define _UNIT_H__ 1 //100us extern void Delay100us(uint8 n); //1s extern void Delay1s(uint16 n); // n <= 6 ,when n==7, it is 1. //1ms extern void Delay1ms(uint16 n); #endif 第一次包含本文件的时候正确编译,并且#define _UNIT_H__ 1,第二次包含本文件#ifndef _UNIT_H__就不再成立,跳过文件。 预编译还有更多的用途,比如可以根据不同的值编译不同的语句,如下: //#pragma REGPARMS #if CPU_TYPE == M128 #include
#endif #if CPU_TYPE == M64 #include #endif #if CPU_TYPE == M32 #include #endif #if CPU_TYPE == M16 #include #endif #if CPU_TYPE == M8 #include #endif - #include
与 #include "filename" 的区别 :前者是包含系统目录include下 的文件,后者是包含程序目录下的文件。
- 好的:
Delay100us();
不好的:Yanshi(); - 好的:
init_devices();
不好的:Chengxuchushihua(); - 好的:
int temp;
不好的:int dd;
- 首先在模块化程序的.h文件中定义extern
//端口初始化 extern void port_init(void); //T2初始化 void timer2_init(void); //各种参数初始化 extern void init_devices(void);
- 模块化程序的.c文件中定义函数,不要在模块化的程序中调用程序,及不要出现向timer2_init();这样函数的使用,因为你以后不知道你到底什么地方调用了函数,导致程序调试难度增加。可以在定义函数的过程中调用其他函数作为函数体。
// PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值)) void timer2_init(void) { TCCR2 = 0x00; //stop TCNT2= 0x01; //set count OCR2 = 0x66; //set compare TCCR2 = (1
- 在少数几个文件中调用函数,在main.c中调用大部分函数,在interupts.c中根据不同的中断调用服务函数。
void main(void) { //初始工作 init_devices(); while(1) { for_ward(0); //默认速度运转 正 Delay1s(5); //延时5s motor_stop(); //停止 Delay1s(5); //延时5s back_ward(0); //默认速度运转 反 Delay1s(5); //延时5s speed_add(20); //加速 Delay1s(5); //延时5s speed_subtract(20); //减速 Delay1s(5); //延时5s } }
- 一是用得非常多的命令或语句,利用宏将其简化。
#ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #ifndef NULL #define NULL 0 #endif #define MIN(a,b) ((ab)?(a):(b)) #define ABS(x) ((x>)?(x):(-x)) typedef unsigned char uint8; typedef signed char int8; typedef unsigned int uint16; typedef signed int int16; typedef unsigned long uint32; typedef signed long int32;
- 二是利用宏定义方便的进行硬件接口操作,再程序需
AVR笔记C语言编程风 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)