ZYNQ的SDK是用C语言进行开发的,C语言可以说是当今理工类大学生的必备技能。我本科学C语言时就是对付考试而已,后面在51单片机里用C语言编过一些课程设计,真的是不熟。现在特开一帖,整理一下C语言的基础知识。
一、位操作
运算符 | & | | | ^ | ~ | << | >> |
含义 | 按位与 | 按位或 | 按位异或 | 取反 | 左移 | 右移 |
tips:不改变其他位的状况下,对某几位赋值,分两步实现
①用 & 进行清0操作: a &= 0x0F; //对第4-7位清0,第0-3位的值不变
②用 | 进行赋值操作: a |= 0x20; //对第4-7位赋值为2,第0-3位的值不变
二、define宏定义
常见格式: #define 标识符 字符串
例如: #define A 8 那么A的值就为8
三、ifdef条件编译
不仅是C语言还是Verilog,都会经常使用这个功能。
// 标识符已被#define定义过则编译程序段1,否则编译程序段2 //=========================================================== #ifdef 标识符 程序段1 #else 程序段2 #endif // #else部分也可以没有 //=========================================================== #ifdef 程序段1 #endif
三、extern变量申明
四、typedef类型别名
typedef 用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。
1.常规方法
①定义一个结构体GPIO
struct _GPIO { __IO uint32_t MODER; __IO uint32_t OTYPER; }
②定义一个变量GPIOA,它是和GPIO类似的结构体变量
struct _GPIO GPIOA
2.typedef法
①为该结构体定义一个别名GPIO_TypeDef
typedef struct { __IO uint32_t MODER; __IO uint32_t OTYPER; } GPIO_TypeDef;
②通过 GPIO_TypeDef 来定义结构体变量:
GPIO_TypeDef_GPIOA;
struct 结构体名{ 成员列表; }变量名列表; //for example -----------------------------------struct U_TYPE { Int BaudRate Int WordLength; }usart1,usart2;
2.也可以在结构体申明的时候定义变量,申明之后再定义:
Struct 结构体名字 结构体变量列表 ; //for example ------------------------------------ struct U_TYPE usart1,usart2;
3.结构体成员变量的引用方法是:
结构体变量名字.成员名 //for example ------------------------------------ usart1.BaudRate;
4.结构体指针变量定义也是一样的,和其他变量没有啥区别
struct U_TYPE *usart3;//定义结构体指针变量 usart1;
5.结构体指针成员变量引用方法是通过 -> 符号实现
Usart3->BaudRate; //访问 usart3 结构体指针指向的结构体的成员变量 BaudRate
6.static的作用
static定义的值称为静态,使用后值不会被释放而是仍然等于它定义时的赋值。
//========================================================================== //== 调用多次 int getValue(),flag = 1,1,1,1,1,1,1,1,1...... //========================================================================== int getValue() { int flag=0; flag++; return flag; } //========================================================================== //== 调用多次 int getValue(),flag = 1,2,3,4,5,6,7,8,9...... //========================================================================== int getValue() { static int flag=0; //只会执行一次 flag++; return flag; }
参考资料:
[2]正点原子STM32教程
[2]威三学院FPGA教程
[3]科技老顽童C语言教程