你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32的常用伪指令

[复制链接]
攻城狮Melo 发布时间:2023-3-21 13:04
1.说到伪指令宏一般就会联想到指令、宏指令和伪指令。
先借用别人的话简单介绍一下三者之间的关联和区别(看到一个博主写的很不错):
我们使用的各种指令,都是写给“编译软件”看的。
要由“编译软件”翻译成计算机可以识别的机器语言,即机器码。

通俗地讲:
就好像召开新闻发布会,主持人用中文讲话,由一个翻译,现场翻译成英文,讲给外国记者听。
主持人说的中文,大部分都是要翻译成英文的;少数几句,是说给翻译听的,告诉他如何翻译。

我们写的指令,由“编译软件”翻译成机器码的,称为指令语句;
有一些是写给“编译软件”看的,不翻译成机器码,这样的就是“伪指令”。

一条条计算机的指令,一般来说,功能都是极为简单的。我们可以把几条、几十条指令,编写成一个“宏指令”,来完成一个比较复杂的任务。
在这样“一批指令”的前面,要用一条“伪指令”来命名这个“宏指令”;
在后面,要用一条“伪指令”说明结尾。
以后,这个“宏指令”,就可以当成 正式指令 来使用了。

2.伪指令宏分为简单宏、参数宏、条件宏、预定义宏和宏释放

简单宏:
定义格式: #define 宏标识符 宏体
是最常见的宏,在宏体长的时候使用续行符“\”连接宏体,如示
  1. #define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
  2.                                     ((PERIPH) == GPIOB) || \
  3.                                     ((PERIPH) == GPIOC) || \
  4.                                     ((PERIPH) == GPIOD) || \
  5.                                     ((PERIPH) == GPIOE) || \
  6.                                     ((PERIPH) == GPIOF) || \
  7.                                     ((PERIPH) == GPIOG))
复制代码

宏的用法:在源文件中,用预处理器伪指令定义过宏标识符后,就可以用宏标识符编写程序。当源文件被预处理器处理时,每遇到该宏标识符,预处理器便在宏的所在处将宏扩展为宏体。
参数宏:
定义格式:#define 宏标识符(形式参数表) 宏体
形式参数表为逗号分割的形式参数,宏体可以用“\”进行续行,使用参数宏时形式参数被换为相同个数的实参数表。(类似于函数的调用,实际上许多库函数时用参数宏编写的。二者区别是参数宏的形式参数表中没有类型说明符)

举例如示
  1. #define IS_GET_GPIO_PIN(PIN) (((PIN) == GPIO_Pin_0) || \
  2.                               ((PIN) == GPIO_Pin_1) || \
  3.                               ((PIN) == GPIO_Pin_2) || \
  4.                               ((PIN) == GPIO_Pin_3) || \
  5.                               ((PIN) == GPIO_Pin_4) || \
  6.                               ((PIN) == GPIO_Pin_5) || \
  7.                               ((PIN) == GPIO_Pin_6) || \
  8.                               ((PIN) == GPIO_Pin_7) || \
  9.                               ((PIN) == GPIO_Pin_8) || \
  10.                               ((PIN) == GPIO_Pin_9) || \
  11.                               ((PIN) == GPIO_Pin_10) || \
  12.                               ((PIN) == GPIO_Pin_11) || \
  13.                               ((PIN) == GPIO_Pin_12) || \
  14.                               ((PIN) == GPIO_Pin_13) || \
  15.                               ((PIN) == GPIO_Pin_14) || \
  16.                               ((PIN) == GPIO_Pin_15))
复制代码

预处理器在处理参数宏时使用俩次宏展开。第一次展开宏体,第二次对展开的宏体用实参数替换形式参数。

宏释放:
定义格式: #undef 宏标识符
用于释放原定义的宏标识符,释放后的宏标识符可以再次用于定义其他宏体。

条件宏定义:
条件宏定义主要是用来测试是否定义过某宏标识符,以及决定如何处理宏标识符,具体格式有俩种:
  1. \\测试存在情况
  2. #ifdef  宏标识符
  3.         #undef  宏标识符
  4.         #define  宏标识符  宏体
  5. #else
  6.         #define  宏标识符  宏体
  7. #endif

  8. \\测试不存在情况
  9. #ifndef  宏标识符
  10.         #define  宏标识符  宏体
  11. #else
  12.         #undef  宏标识符
  13.         #define  宏标识符  宏体
  14. #endif
复制代码

常用于头文件中。

预定义宏:
预定义宏基本莫得存在感,其特征就是标识符前后都有双下划线。如
  1. __DATE__     __TIME__
  2. __FILE__     __LINE__
  3. __STDC__
复制代码

这些预定义宏的宏体分别是当时的日期、时间、所在文件名、所在文件的行数。
————————————————
版权声明:Aspirant-GQ
如有侵权请联系删除

收藏 评论0 发布时间:2023-3-21 13:04

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版