嵌入式c第二次作业

嵌入式c 专栏收录该内容
2 篇文章 0 订阅

一,Typedef 

typedef用于为现有类型创建一个新的名字,称为类型别名,可简化变量的定义。在嵌入式系统开发中,typedef常用于定义结构体别名和枚举类型了。

struct _GPIO { __IO uint32_t MODER; __IO uint32_t OTYPER;......};

上述指令定义了一个结构体_GPIO typedef类型别名

 

嵌入式C语言一些常见用法在实际使用中,常常为结构体定义别名,写法如下:

typedef struct { __IO uint32_t MOD__IO uint32_t OTY......} GPIO_TypeDef;

// GPIO_TypeDef 为该结构体的别名

二,结构体

 

      嵌入式C语言一些常见用法1、结构体的申明与使用方法比较灵活,其一般形式为:struct结构体名{类型名1成员名1 ;类型名2成员名2 ;......类型名n成员名n ;} 

      嵌入式C语言一些常见用法2、当需要使用结构体类型的变量、指针变量和数组时,有以下三种方法:方法一:定义结构体类型时,同时定义该类型的变量。例如:struct Student{charname[10]; charsex; intage; floatscore; } stu1,*ps,stu[5];//定义结构体类型的普通变量、指针变量和数组

    嵌入式C语言一些常见用法方法二:先定义结构体类型,再定义该类型的变量。例如:structstudent{charname[10];charsex;intage;floatscore;};structstudentstu1,*ps,stu[5];//定义结构体类型的普通变量、指针变量和数组

     嵌入式C语言一些常见用法方法三:先用类型定义符typedef为结构体类型命别名,再用别名定义变量。例如:typedefstruct[student]{charname[10];charsex;intage;floatscore;}STU;STUstu1,*ps,stu[5];//用别名定义结构体类型的普通变量、指针变量和数组  嵌入式C语言一些常见用法3、结构体变量赋初值的方法:struct[student]{charname[10];charsex;intage;floatscore;} stu[2]={{"Li",'F',22,90.5},{"Su",'M',20,88.5}}

    嵌入式C语言一些常见用法4、引用结构体变量中成员的方法:结构体变量名. 成员名:stu1.name结构体指针变量成员名:ps name(*结构体指针变量). 成员名:(*ps).name结构体变量数组名. 成员名:stu[0].name5.4.6 结构体

   三,宏定义

1. 防止一个头文件被重复包含
1#ifndef COMDEF_H  2#define COMDEF_H 3//头文件内容 4#endif 
2. 重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
3. 得到指定地址上的一个字节或字
1#define MEM_B( x ) ( *( (byte *) (x) ) ) 2#define MEM_W( x ) ( *( (word *) (x) ) ) 
4. 求最大值和最小值
1#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) ) 2#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) ) 
5. 得到一个field在结构体(struct)中的偏移量
1#define FPOS( type, field ) \ 2/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */ 
6. 得到一个结构体中field所占用的字节数
1#define FSIZ( type, field ) sizeof( ((type *) 0)->field ) 四
7. 按照LSB格式把两个字节转化为一个Word
1#define FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )
8. 按照LSB格式把一个Word转化为两个字节
1#define FLOPW( ray, val ) \ 2(ray)[0] = ((val) / 256); \ 3(ray)[1] = ((val) & 0xFF)
9. 得到一个变量的地址(word宽度)
1#define B_PTR( var ) ( (byte *) (void *) &(var) ) 2#define W_PTR( var ) ( (word *) (void *) &(var) )
10. 得到一个字的高位和低位

四,条件编译

 在程序设计时,可以根据条件编译告诉编译器的条件执行或者忽略代码。例如在配置从机(eg: 模拟前端)的寄存器时,需要确认数据写入是否成功,进行读出和重写!此时可选择性的选择是否重写和重写次数。

条件编译规则如下:

  #ifdef MAVIS //如果定义了MAVIS,则执行下面的条件

      再例如:在定义头文件时,为了避免重复定义使用#ifndef  #endif来定义。

  1. 1) 一个功能中,包含一个.C文件和一个.h文件。在.h文件中最好将用#ifndef #endif将 关键字重定义,库文件包含,宏参数定义,结构体定义,函数声明等包含进去。这样,头文件可以避免被多次包含。头文件中定义的变量不存在重复声明或定义。

  2. 2)__USER_CS1258_H__ :下划线“__”属于编程风格的内容,对程序没有影响。不用下划线也可以,用几个下划线也由个人习惯。需要大写是因为其实质是一个宏名,宏名需要大写,其次下划线是为了容易区分,避免命名重复;注:标准保留使用下划线作为前缀, 所以在自己的代码中不要这样写, 避免与标准头文件中的宏发生冲突。

  3. 3)C语言一般支持8层以上的文件包含;

  4. 4)当预处理器首次发现该文件被包含时,__USER_CS1258_H__ 是未定义的, 所以定义了__USER_CS1258_H__ , 并接着处理该文件的其他部分。 当预处理器第2次发现该文件被包含时, __USER_CS1258_H__ 是已定义的,所以预处理器跳过了该文件的其他部分。 

  5. 再例如,运用#if  #elif  #elif #else #endif 来进行条件编译

  6. #if defined (IBMPC) //可以用 #if defined(VAX) 代替 #ifndef VAX 和#elif 一起使用;

  7. #include "ibmpc.h"

  8. #elif defined (VAX)

  9. #include "vax.h"

  10. #elif defined (MAC)

  11. #include "mac.h"

  12. #else

  13. #include "general.h"

  14. #endif

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

何行有

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值