嵌入式开发中一些需要留意的地方

这篇具有很好参考价值的文章主要介绍了嵌入式开发中一些需要留意的地方。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        使用STM32开发的朋友不知道是否有发现过这样的一些宏定义?如下:

#if defined (__CC_ARM)
#pragma anon_unions
#endif

        看到上面的语句一开始确实搞不懂为什么要写这些东西,通过上网去查询,才搞明白这其中的使用原理。

        上面的代码段我们可以看到两部分的内容:

        1)__CC_ARM

        2)#pragma anon_unions

        这两个都有啥用呢?待我一一道来!

1、__CC_ARM 是 ARM 编译中的宏选项

        __CC_ARM 是一个编译器的选项,在ARM开发中根据开发环境的不同,有好几个可选的宏选项。

        这些选项可以查看所开发的芯片的内核文件,比如我使用的是STM32F407,所以我从 core_cm4.h 文件中可以查阅到:

#if   defined ( __CC_ARM )
  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
  #define __STATIC_INLINE  static __inline

#elif defined ( __GNUC__ )
  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
  #define __STATIC_INLINE  static inline

#elif defined ( __ICCARM__ )
  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
  #define __STATIC_INLINE  static inline

#elif defined ( __TMS470__ )
  #define __ASM            __asm                                      /*!< asm keyword for TI CCS Compiler       */
  #define __STATIC_INLINE  static inline

#elif defined ( __TASKING__ )
  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
  #define __STATIC_INLINE  static inline

#elif defined ( __CSMC__ )
  #define __packed
  #define __ASM            _asm                                      /*!< asm keyword for COSMIC Compiler      */
  #define __INLINE         inline                                    /*use -pc99 on compile line !< inline keyword for COSMIC Compiler   */
  #define __STATIC_INLINE  static inline

#endif

其中:

        1)__CC_ARM 是对应 ARM RealView 开发平台的,它需结合uvision、eclipse或CodeWarrior等开发环境来使用的。

        2)__ICCARM__ 是对应 IAR EWARM 开发环境的,是 IAR Systems 公司为ARM 微处理器开发的一个集成开发环境。

        3)__GNUC__ 是对应 GNU Compiler Collection 开发平台的。GCC最初是为GNU操作系统专门编写的一款编译器,是一款开源的软件。

        4)__TASKING__ 是对应 Altinum Designer 开发平台的。Altium Designer 是原Protel软件开发商Altium公司推出的一体化的电子产品开发系统。

2、#pragma anon_unions 支持匿名结构体/联合体

        匿名结构体/联合体指的是没有命名的结构,因为没有对应的名字,所以也不会直接创建这个对象或者变量,一般都是在嵌套结构中使用。

        之所以要使用这个东西进行,是因为在gcc编译器中是支持匿名结构体/联合体的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的结构体/结合体,就需要使用 #pragma anon_unions 告知编译器,不然会编译不通过。

        那到底什么样的才算是匿名结构体/联合体呢?我下面举个例子,大家一看就会明白了。

        如下代码:

typedef union
{
    struct {
        uint32_t Address;  
        uint32_t OutputBits; 
        uint32_t ExtendedAddressBits; 
        uint32_t ExtendedOutputBit;  
        uint32_t FrameID;
        uint32_t EmptyBits;
    };
    uint32_t Value;
} StdFrame_t;

        从上面可以看出来,定义结构体或者联合体时,如果没有命名的话,那这个结构体/联合体就是匿名的。

        注:#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。

3、补充几个调试非常好的操作

3.1、__LINE__

        __LINE__ 用以指示本行语句在源文件中的位置信息,即这条语句在源文件中的行号。

3.2、__FILE__

        __FILE__ 用以指示本行语句所在源文件的文件名,即标示这条语句是在哪个源文件中出现的。

3.3、__func__

        __func__ 用于指示某个语句出现在哪个函数中,即可以输出该语句所在的函数的函数名。

        注意:这个关键字在windows下时使用vc6.0是不支持的。文章来源地址https://www.toymoban.com/news/detail-739278.html

到了这里,关于嵌入式开发中一些需要留意的地方的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【嵌入式开发学习】__分享一些高效率的“学习软件”

    目录 前言 软件分享 VSCode 代码编辑器 ChatGPT 语言模型 Notion 笔记记录  Microsoft To Do 日程记录 zlibrary 图书下载 结束语 (* ̄︶ ̄)创作不易!期待你们的 点赞、收藏和评论喔。 在工作学习中,我们会使用到很多的工具,好的工具可以起到事半功倍的效果。我对工具的要求一般是

    2024年02月06日
    浏览(51)
  • 嵌入式硬件需要过哪几关?

    目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 模电数电不用太纠

    2024年04月17日
    浏览(41)
  • 嵌入式的学习需要合理规划时间

    很多粉丝,问我, \\\"胡老师我想报您的培训班。\\\" ... 得知我知识业余时间写文章,紧接着又会问, \\\"jg单位这么清闲啊,你居然有这么多时间写文章的?而且你文章很深,每一篇我都看都要看很久!\\\" ... 这种粉丝确定不是来害我的??! 在此澄清3点: 我的工作还是很忙的 工

    2024年02月03日
    浏览(28)
  • 嵌入式单元测试工具Tessy的一些测试技巧

    最近做了一个平台项目,需要进行动态代码测试,入门了嵌入式单元测试工具Tessy,总结了一些简单的测试技巧。 当前网上的教程普遍只写内容概要,真正入手还得自己认真摸索一番。为此,特意总结了一些Tessy测试技巧以供有缘人参考。 提几个Tessy工具使用的问题。 1.如何

    2023年04月17日
    浏览(58)
  • 嵌入式STM32程序一些卡死的原因

    嵌入式STM32程序卡死的原因可能有以下几种: 1、死循环:程序中存在死循环,导致程序无法继续执行下去。 2、中断问题:中断处理不当,导致程序无法正常运行。 3、堆栈溢出:程序中使用的堆栈空间超出了预设的范围,导致程序无法正常运行。 4、资源竞争:多个任务或中

    2024年02月08日
    浏览(57)
  • 这些嵌入式系统安全性的知识你需要了解

    这可能是 工程师在面对 嵌入式系统应用 程序的安全性时可能提出的第一个问题。 不幸的是,有大量的“安全软件包”可用,并且对安全性不熟悉的 嵌入式工程师 可能只将安全性称为加密或病毒防护。尽管加密是安全性的一种工具,而病毒扫描程序从技术上讲可以提供安全

    2024年02月09日
    浏览(42)
  • 本科自动化专业,单片机、PLC、嵌入式等方向哪个前景好一些?

    最近看到一个topic:本科自动化专业,单片机、PLC、嵌入式等方向哪个前景好一些? 先纠正一个错误观点,单片机其实是嵌入式的一个职业方向,也算是嵌入式的一种,因为程式都是 嵌入到芯片内部运行,区别是单片机一般最多只能跑freertos系统这些小系统,性能相对来说没

    2024年02月11日
    浏览(33)
  • 适合嵌入式开发的GUI(嵌入式学习)

    嵌入式开发中的GUI(图形用户界面)是指在嵌入式系统中实现图形化的用户界面,以便用户可以通过触摸屏、按钮、鼠标或其他输入设备与系统进行交互。 以下是一些常见的嵌入式GUI开发方法: 轻量级GUI库:一些轻量级的GUI库适用于嵌入式系统,例如uGFX、LittlevGL、Nanogui等。

    2024年02月09日
    浏览(67)
  • 嵌入式Linux:如何进行嵌入式Linux开发?

    目录 1、裸机开发 2、SDK开发 3、驱动开发 3.1、字符设备驱动 3.2、块设备驱动 3.3、网络设备驱动 4、应用开发 嵌入式Linux开发主要有四种方式:裸机开发、SDK开发、驱动开发和应用开发。 裸机开发通常指在没有操作系统支持的环境中直接在硬件上运行程序的开发。这种开发方

    2024年01月25日
    浏览(78)
  • 嵌入式开发:单片机嵌入式Linux学习路径

    SOC(System on a Chip)的本质区别在于架构和功能。低端SOC如基于Cortex-M架构的芯片,如STM32和NXP LPC1xxx系列,不具备MMU(Memory Management Unit),适用于轻量级实时操作系统如uCOS和FreeRTOS。高端SOC如基于Cortex-A架构的芯片,如三星、高通、飞卡、全志和瑞芯微等,具备MMU,支持虚拟内

    2024年02月15日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包