飞道的博客

MCU学习笔记_C语言基础

177人阅读  评论(0)

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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场