C语言学习总结谈谈俺学单片机编程的几种新用法.pdf
上传人:qw****27 上传时间:2024-09-12 格式:PDF 页数:4 大小:106KB 金币:15 举报 版权申诉
预览加载中,请您耐心等待几秒...

C语言学习总结谈谈俺学单片机编程的几种新用法.pdf

C语言学习总结谈谈俺学单片机编程的几种新用法.pdf

预览

在线预览结束,喜欢就下载吧,查找使用更方便

15 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C语言学习总结:谈谈俺学单片机编程的几种新用法搞嵌入式的,大都用C语言写代码,本人从事单片机开发,也写了不少的代码,一直习惯用if、switch打天下,在定义数据结构的时候也只用到字符型、整型、数组,位;很少用结构体,共用体,枚举,因为咱C语言学得不好,和它们不熟,总感觉它们不那么好招呼,重要的是自已觉得没必要用上它们。随着越来越多的积累,咱写代码的风格也在不断的发生变化,从以前的喜欢将所有的函数及数据的定义写在一个文件里到逐渐的将函数按功能模块化、从以前的习惯直接在程序里写常数到慢慢的开始用上宏来代替,咱编程的风格也逐渐开始正规化,编程水平也逐步提升,当然这些成绩都源于咱不断的学习,学习匠人的编程规范、学习herald的感悟设计、还有网上写得非常出色的代码以及STM32的固件函数库,在咱的不断领悟和思考下,总结了几点关于C语言的用法,与大家共同分享。一、学习匠人的头文件包含巧妙用法当一个头文件被多个C文件包含,且该头文件中定义了这些C文件的公共变量,则在编译的时候会出现重复定义,导致编译通不过,通常我们会采用如下两种做法来解决上述问题。(为了让问题表述得更清楚,我们假设两个C文件C1,C2,C3,一个头文件H1,C1,C2,C3有两个公共变量V1和V2)1、在C1文件中定义变量V1和V2,在C2和C3文件中对V1,V2用extern声明;2、在C1文件中定义变量V1和V2,在H1中对V1,V2用extern声明,然后在C2和C3文件中包含H1;很显然,以上两种方法都要对V1和V2书写至少两次,一次定义,一次外部声明,且不是在同一文件下,这样不利于管理和修改,有没有一种方法可以让这些公用的变量放在一个文件里,且只要书写一次呢?偶在二姨那里无意中看到匠人的发帖,就是关于该问题的讨论,现在我转发一下,与大家同共分享。首先我们将要用到的公共变量全部书写到com.h文件中,每一个变量在定义前加一个符号EXT_,当该头文件被main.c函数包含时,定义EXT_为空,表示com.h中的变量在main.c中被定义,当被其它文件包含时,定义EXT_为extern,表示外部声明,如:Com.h文件://避免重复定义#ifdefroot#defineEXT_#else#defineEXT_extern#endif//全局变量EXT_u8variable1;//该变量在三个C文件中都要用到Main.c#defineroot//在包含com.h前定义root#include"com.h"二、用结构体的方式来定义总线或外设地址当一个整体包含不同类型的多个成员时,通常用结构体来定义结构体变量,这样内存会将这些变量按照递增的方式分配到相邻的地址(不对齐的地方会有填充),按“结构体名.成员名”的方式访问结构体内的成员,这是访问结构体变量的方式;但是还有一种指向结构体变量的指针,它可以将某个地址转换成该结构体类型的指针,比如寄存器的定义:(以下是摘自STM32固件函数库,关于GPIO的定义)typedefstruct{vu32CRL;//0vu32CRH;//偏移量4vu32IDR;//偏移量8vu32ODR;vu32BSRR;vu32BRR;vu32LCKR;}GPIO_TypeDef;#defineGPIOA_BASE((u32)0x40010800)//GPIOA的基地址为0x40010800#defineGPIOA(GPIO_TypeDef*)GPIOA_BASE;//强制类型转换为GPIO_TypeDef类型的指针这样在操作GPIOA的寄存器时只要这样写就可以了读:X="GPIOA-">CRL;写:GPIOA->CRL=X;或读:X=(*GPIOA).CRL;写:(*GPIOA).CRL=X;当然,要达到上述目的也可以采用如下方式#defineGPIOA_CRL0x40010800#defineGPIOA_CRH0x40010804#defineGPIOA_IDR0x40010808#defineGPIOA_ODR0x4001080C#defineGPIOA_BSSR0x40010810#defineGPIOA_LCKR0x40010814很明显,第一种书写方式更加正规化,且当定义多个GPIO时,只要将其它GPIO的基地址强制转换为该结构类型的指针即可。再来看看一个定义外部总线的例子typedefstruct{vu8CH375_DATA;vu8CH375_CMD;//偏移量1}CH375_TypeDef;#defineCH375((CH375_TypeDef*)0x6c000000)