MCU学习笔记
C语言基础
1. 位操作
2. define宏定义关键词
3. ifdef /ifndef 条件编译
4. extern变量声明
5. typedef 类型别名
6. 结构体
7. static关键词
8. __weak弱函数
1. 位操作
-
6种位操作运算符
“&”:按位与;
“|”:按位或;两个操作位,只要有一个为1,结果就为1;
“^”:按位异或;两个操作位不同时,结果为1;
“~”:取反;
“<<”:左移;
“>>”:右移;
2. define宏定义关键词
-
define,预处理命令,用于宏定义,可以提高代码的可读性,为编程提供方便。
-
格式:#define 标识符 字符串
标识符:所定义的宏名。
字符串:可以是常数,表达式,格式串 -
例子:
//定义标识符SYSCLK_72MHz的值为72000000
#define SYSCLK_72MHz 72000000
3. ifdef /ifndef 条件编译
- 单片机程序开发中,经常遇到一种情况,当满足某条件时,对一组程序进行编译,而当不满足条件时,则编译另一组程序。
- 格式:
#ifdef 标识符 //如果定义了标识符
编译程序段1 //执行程序段1
#else //如果没有定义标识符
编译程序段2 //执行程序段2
#endif
- 例子:
#define TAG 1 //定义TAG 为1
#ifdef TAG //条件编译TAG
void test ifdef (void) //如果条件编译TAG存在
{
printf(”this tag is defined”);//打印this tag is defined
}
#else //如果条件编译TAG不存在
void test ifdef (void) //打印this tag is not defined
{
printf(”this tag is not defined”);
}
#endif
- 格式:
#ifndef 标识符//如果没有定义
编译程序段1 //执行编译程序段1
#else //如果定义
编译程序段2 //执行条件编译程序2
#endif
- 例子:
#define TAG 1 //定义TAG 为1
#ifndef TAG //如果没有条件编译TAG
void test ifdef (void) //执行此段程序
{
printf(”this tag is defined”);
}
#else //如果条件编译TAG
void test ifdef (void) //执行此段程序
{
printf(”this tag is not defined”);
}
#endif
4. extern变量声明
- C语言中 extern可以放在变量或者函数前,以表示变量(全局变量)或者函数的定义在别的文件中,提示编译器遇到此变量和函数时,在其他模块中寻找其定义。
- 注意: 对于extern,声明变量可以多次,但对变量的定义只能有一次。
- 格式
extern 变量类型 变量名称
- 例子
//整型变量id是定义在其他文件中的变量,如果想在当前文件中使用,可以使用extern变量声明
extern int id
5. typedef 类型别名
- 为一个类型重新定义一种别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。
- 格式
typedef 原类型名 别名
- 例子
//将无符号字符定义为 uint8_t
typedef unsigned char uint8_t;
//将无符号短整型定义为 uint16_t
typedef unsigned short int uint16_t;
//将无符号整型定义为 uint32_t
typedef unsigned int uint32_t;
6. 结构体
- 结构体,构造类型
- 在结构体声明的时候,可以定义变量,也可以声明之后定义;方法:struct 结构体名字 结构体变量列表;
- 格式
struct 结构体名{
成员列表1;
成员列表2;
...
}变量名列表;
-
结构体作用
同一个类型可以用数组,不同类型可以用结构体组织。
结构体的扩展性很强。可用于外设的初始化。
7. static关键词
- static,可以放在变量和函数之前,static声明的局部变量,存储在静态存储区;在函数调用之后,不会被释放,它的值会一直保留下来。所以说,static声明的局部变量,具有记忆功能。
- 注意:
static声明的函数作用域仅限当前的.c文件,其他.c无法调用。
static声明的局部变量,即静态的局部变量,在初始化的时候,只会被初始化一次。 - 格式
static 变量类型 变量名称
- 例子
//static 声明变量
void getstaticval(void) //
{
static int val=0;
val++;
return val;
}
//普通声明变量
void getval(void) //
{
int val=0;
val++;
return val;
}
//测试函数
void teststaticval(void) //
{
int cnt=5;
cnt--;
while(cnt--)
{
printf("get val= d%/r/n," getval()); //调用getval函数
}
cnt=5;
while(cnt--)
{
printf("get static val= d%/r/n," getstaticval()); //调用getstaticval函数
}
}
8. __weak弱函数
- 弱函数定义的内容,没有实际操作,需要用户自己写;当用户没有重新写时,操作的过程中,直接调用弱函数;当用户重新写后,操作的过程中,调用用户重新写的程序内容。
- weak函数和重写的函数不能放在同一个文件
- 避免重复定义
- 如果用户没有重写,那么会执行弱函数,如果用户重写该函数,那么会执行弱函数
- 格式
__weak void 函数名()
{
函数操作内容
}
- 例子:
//当用户没有重新写时,操作的过程中,直接文件1中的testweak();当用户重新写后,操作的过程中,调用用户重新写的文件2中的testweak()。
//文件1中
__weak void testweak()
{
printf("testweak function");
}
//文件2中
//用户编写的函数
```c
void testweak()
{
printf("test function");
}
int main(void)
{
testweak();
}
参考资料:正点原子STM32视频 Thanks^^
【注】:个人学习笔记,如有错误,望不吝赐教,这厢有礼了~~~
转载:https://blog.csdn.net/weixin_50722839/article/details/115830806
查看评论