在 MCU 上运行高级 C++ 软件

2023-10-27

使用 C++ 开发用户应用程序有很多优势,因此该语言在包括基于 MCU 的系统中变得越来越流行也就不足为奇了。“mbed”项目完全专注于这种语言。许多 RTOS 提供 C++ 兼容层,但与“大”系统(具有 MMU)相比,大多数 RTOS 都有一些限制。在本文中,我们将研究 C++ 的内部结构并找出造成这些限制的原因。

MCU 上的 C++ 有两个主要限制:重新启动应用程序和标准 C++ 库的多线程功能。

本文中的大多数示例都将在Embox RTOS上进行考虑。该 RTOS 允许在 MCU 上运行像OpenCV这样复杂的 C++ 项目。该项目需要标准 C++ 库中的线程支持。此外,与 MCU 上的其他 RTOS 不同,Embox 允许重新启动 C++ 应用程序。我们将使用带有外部 SDRAM 的 STM32F769i 板来演示 OpenCV,因为该框架需要数百 KB 的 RAM。但是,几千字节的 RAM 足以运行简单的 C++ 应用程序。

基本语法

C++ 语言的语法由编译器实现。这些功能包含在名为“libsupc++”的语言支持库中。在应用程序运行时必须处理一些部分。例如,需要处理全局构造函数和析构函数。

全局构造函数和析构函数

让我们看看任何 C++ 应用程序如何与全局构造函数和析构函数一起工作。所有全局 C++ 对象都是在程序调用 main() 之前创建的。为此有一些特殊的部分:“.init_array”、“.init”、“.preinit_array”、“.ctors”。这些是指向函数的指针数组,必须从头到尾遍历,调用数组的相应元素。

Embox 中调用全局对象构造函数的代码如下:

void cxx_invoke_constructors(void) {
   extern const char _ctors_start, _ctors_end;
   typedef void (*ctor_func_t)(void);
   ctor_func_t *func = (ctor_func_t *) &_ctors_start;
   ...
   for (; func != (ctor_func_t *) &_ctors_end; func++) {
       (*func)();
   }
}

让我们看看 C++ 应用程序的终止是如何工作的,即调用全局对象的析构函数。有两种方法。

首先,编译器中最常用的是使用来自 C++ 应用程序二进制接口 (ABI) 的 __cxa_atexit()。这是 POSIX atexit() 的类似物。也就是说,您可以注册将在程序终止期间调用的特殊处理程序。当在应用程序开始时调用全局构造函数时,如上所述,还有编译器生成的代码,用于使用 __cxa_atexit() 注册析构函数处理程序。

第二种方法是将指向析构函数的指针存储在特殊部分“.fini_array”和“.fini”中。如果指定了“-fno-use-cxa-atexit”标志,GCC 编译器将使用这种方式。在这种情况下,在应用程序终止期间,必须以相反的顺序(从高地址到低地址)调用析构函数。这种方法不太常见,但在微控制器中很有用。因为,在这种情况下,可以找出编译时需要多少个处理程序。

Embox 中调用全局对象析构函数的代码如下:

int __cxa_atexit(void (*f)(void *), void *objptr, void *dso) {
   如果(atexit_func_count >= TABLE_SIZE){
       printf("__cxa_atexit: 静态销毁表溢出。\n");
       返回-1;
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MCU 上运行高级 C++ 软件 的相关文章

  • Word‘由于宏安全设置 无法找到宏’问题解决

    针对这个问题 尝试试很多网上的做法无果后 意外发现是自己电脑的杀毒软件把该文件误认为是病毒隔离起来 只需将其恢复到信任区即可 若仍无法解决 检查word是否启用宏
  • 我靠TikTok抖音赚到了人生第一桶金:这个风口行业,真的很赚钱

    现代人的 懒 简直超乎你想象 吃饭靠外卖 买东西靠快递 凡是一切你能想到的 麻烦 现代科技都能替你搞定 而这 恰恰是一种新型的赚钱方式 十年前的淘宝被人嘲笑 说这是马云的异想天开 十年后的淘宝 拼多多 京东告诉你 这一切都已成真 而且带着一
  • 虚拟机迁移原理

    我们常常遇到需要迁移虚拟机的问题 比如需要维护某台设备 会将设备上的一切应用迁移到另一台设备 但是如何将虚拟机进行迁移呢 好比说 虚拟机中正在运行一个程序 这个程序有源源不断的数据访问 怎么使得在不影响这些访问的情况下把虚拟机迁移到领一台服
  • C语言图形库——EasyX常用函数

    上节讲到贴出一张图片的过程 本节接着介绍一些基本的图形库函数 头文件 include
  • 深入浅出SSD--5.1PCIE基础知识

    深入浅出SSD 5 1PCIE基础知识 1 关于PCIE的速度 SSD使用PCIe接口比SATA快 下面是PCIE1 0 2 0 3 0速度 表中的带宽 比如PCIe3 0 1 带宽为2GB s 是指双向带宽 即读写带宽 如果单指读或者写
  • 本周最新文献速递20220522

    本周最新文献速递20220522 一 精细解读文献 一 文献题目 Single nucleus chromatin accessibility profiling highlights regulatory mechanisms of co
  • xml转换word文档

    点击下载 download value flag let this this this axios method get url url lengthMeasurementTwice params machineId this machin
  • http请求头origin、referer和host区别

    1 Host 描述请求将被发送的目的地 包括且仅仅包括域名和端口号 HTTP 1 1 的所有请求报文中必须包含一个Host头字段 且只能设置一个 2 Origin 请求头origin表明了请求来自于哪个站点 包括且仅仅包括协议 域名和端口
  • 创维机顶盒E900刷LinuxNas系统

    家里有一个一直没用的创维E900的机顶盒 芯片是海思 hi3798v100 的 本着废物利用的原则 我想将他刷成linux 没想到网上真的有教程 https histb com 我看了一下 以我现在的技术 问题不大 大不了变砖罢了 反正都是
  • js 中数字小数点末尾的0显示与否

    js 中数字小数点末尾的0显示与否 不显示0 显示0 数字格式化 不显示0 我们先来看一道例题 然后围绕其展开 零 的讨论 问题 得到一个随机数组成的数组 数组长度为10 结果类似于 0 243 0 162 0 701 0 501 此处封装
  • Learn OpenGL with Qt——模型加载:Qt搭建Assimp环境

    如果你是中途开始学习本教程的 即使你对OpenGL已经非常熟悉 请至少了解以下几个章节 因为Qt中提供了OpenGL的很多便捷操作 熟悉这些操作可以让我们在Qt中高效的使用OpenGL进行绘图 创建OpenGL窗口 着色器程序以及着色器的创
  • 如何克服看到别人优于自己而感到的焦虑和迷茫?

    文章目录 每日一句正能量 前言 简述自己的感受 怎么做 如何调整自己的心态 后记 每日一句正能量 行动是至于恐惧的良药 而犹豫 拖延 将不断滋养恐惧 前言 虽然清楚知识需要靠时间沉淀 但在看到自己做不出来的题别人会做 自己写不出的代码别人会
  • 使用Java显示图片

    之前学习C和C 时总是和数据打交道 也许是学的浅薄的关系 当时觉得显示界面和图像是如此的神秘 如今学习了一段时间的Java 发现其实界面什么的也不是那么的难懂 下面写一个简单的例子 让我们的java为我们展示张图片来看看吧 面板源码 jav
  • [LLVM教程]LLVM之第一个语言前端

    目录 LLVM教程 LLVM之第一个语言前端 LLVM教程 LLVM之第一个语言前端 万花筒 介绍与词法分析器 LLVM Tutorial Table of Contents LLVM 17 0 0git documentation LLV
  • 统计学习方法EM课后答案

    https sine x com statistical learning method 第9章 em算法及其推广 https blog csdn net weixin 35479108 article details 87894136 h
  • STM32入门——外部中断

    中断系统概述 中断 在主程序运行过程中 出现了特定的中断触发条件 中断源 使得CPU暂停当前正在运行的程序 转而去处理中断程序 处理完成后又返回原来被暂停的位置继续运行 中断优先级 当有多个中断源同时申请中断时 CPU会根据中断源的轻重缓急
  • Cannot read property 'newLine' of undefined

    angularjs报错 ERROR in src main ts Module build failed TypeError Cannot read property newLine of undefined at Object getNe
  • GitLab(Gitee)配置SSH key

    1 我们已经有了gitlab的账户 项目组已经将我们添加到了group 2 打开git bash 输入命令 ls al ssh 如果显示如下图 则表示生成过key 可以去执行第4个步骤 否则的话执行第三个步骤生成key 3 输入命令 ssh
  • 快乐的强化学习1——Q_Learning及其实现方法

    快乐的强化学习1 Q Learning及其实现方法 学习前言 简介 Q Learning算法的实现 具体实现代码 GITHUB下载连接 学习前言 刚刚从大学毕业 近来闲来无事 开始了机器学习的旅程 深度学习是机器学习的重要一环 其可以使得机
  • 深入AMS源码(四)——ActivityManagerService的进程管理

    1 AMS中的进程管理 final ArrayList

随机推荐

  • 2023年大数据与计算国际会议 (WBDC 2023)

    会议简介 Brief Introduction 2023年大数据与计算国际会议 WBDC 2023 会议时间 2023年11月17 19日 召开地点 中国 西安 大会官网 www iwbdc org 2023年大数据与计算国际会议 WBDC
  • 机器翻译系统,主要划分为哪几大类型?

    直到20世纪80年代 一些机器翻译系统采用了两种方法 在这些方法中 源语言文本被分析转换成抽象表达形式 随后利用一些程序 通过识别词结构 词法分析 和句子结构 句法分析 解决歧义问题 其中有一种方法将抽象表达设计为一种与具体语种无关的 中间
  • Arduino学习笔记

    一 引脚 二 函数介绍 1 pinMode pin mode 引脚配置成输入或者输出 其中mode可以为INPUT或者OUTPUT 例如 pinMode 7 INPUT 将引脚7定义为输入接口 2 digitalWrite pin valu
  • OAuth2简介生成accessToken(一)

    1 OAuth3需要引入的依赖 版本号根据实际情况添加哦
  • HTTP中application/x-www-form-urlencoded字符说明

    一 概述 在学习ajax的时候 如果用post请求 需要设置如下代码 ajax setRequestHeader content type application x www form urlencoded 虽然知道需要这么做 但是不知道a
  • postman pre-request scripts 导入js文件_Postman 高级用法指南

    Postman是一款强大的API接口测试工具 有许多不容易发现的好用的功能 下面简单介绍其中一部分功能 详细内容可以参考文档 官方还有视频教程 非常方便入手 后续本博客会持续提供一些Postman使用的细节技巧 方便大家用Postman进行
  • strstr函数底层逻辑实现

    一 函数介绍 char strstr const char haystack const char needle 功能 在字符串haystack中查找字符串needle出现的位置 参数 haystack 源字符串首地址 needle 匹配字
  • C++读写txt文件(基本操作1)

    本博客主要写了用C 读写txt本文的基本操作 最简单的写入和读出两个基本操作 本程序的功能是向Test txt文件文件写入字符串 This is a Test12 和读取字符串 This is a Test12 并且将读取到的字符串存到te
  • python组件

    1 生成6位数字随机验证码 import random import string def num code length 6 生成长度为length的数字随机验证码 param length 验证码长度 return 验证码 return
  • STM32—ADC和DMA的应用之电流检测(第二部分:电流检测电路与数据处理)

    文章目录 前言 一 电流检测原理 1 霍尔效应 2 CC6902电流传感器 二 电流检测电路 三 数据处理 前言 前一部分介绍了如何配置ADC和DMA 这一部分介绍在硬件部分如何实现电流检测以及检测到电流后的数据处理 一 电流检测原理 1
  • QT-CSV文件读写

    QT CSV文件读写 前言 一 CSV文件初始化 二 CSV写入 三 CSV读取 四 程序链接 前言 csv文件之所以被用户推荐使用 我觉得即可以用excel打开 同时也是可以用文本编辑器打开 而且文本内容的显示也是比较有规律 用户查看起来
  • 2013中国数据库技术大会

    http www cn21 com cn meet 2013sjk yjjb html
  • Web 应用程序——我的心理备忘单

    介绍 本文是 持续交付 HTML 到 Kubernetes 的一部分 虽然我迫不及待地想深入了解分布式系统的细节 但我发现自己处于一个不愉快的境地 我认为最好从前端开始写 那是因为网络应用程序是当今的标准 在多个云中部署的 ArgoCD K
  • 图像增广:强化深度学习的视觉表现力

    目录 摘要 1 图像增广简介 2 图像增广的原理 3 常见的图像增广技术 4 如何在实际项目中应用图像增广 5 实际应用 摘要 当今 深度学习已经在计算机视觉领域取得了令人瞩目的成就 图像增广作为一种数据处理技术 让我们在使用有限的图像数据
  • Lipschitz常数、Lipschitz条件

    参考 https www zybang com question dd732fbc5a0224c6526bcdfba613b53c html https baike baidu com item lipschitz E6 9D A1 E4
  • OPENCV中的批改答题卡

    Fu Xianjun All Rights Reserved 文章目录 前言 一 为什么使用OPENCV 二 使用步骤 1 引入库 2 写入基本函数 这样打包好就可以套用了 多少方便不知道 3 导入图片利用上面的函数来进行处理 没错就是这么
  • 解决Jmeter压测异常率过高的问题

    今天在使用本地 Windows Jmeter对远程服务器进行压力测试的时候 发现异常率非常的高 但是项目中日志没有报错误 然后观察TCP链接数排除了服务端的嫌疑 发现随着压测的进行 TCP连接数越来越少 打开日志输出发现报了大量的以下错误
  • leetcode5.最长回文子串

    最长回文子串 给你一个字符串 s 找到 s 中最长的回文子串 如果字符串的反序与原始字符串相同 则该字符串称为回文字符串 示例 1 输入 s babad 输出 bab 解释 aba 同样是符合题意的答案 示例 2 输入 s cbbd 输出
  • 注释整段代码

    选中需要注释的整段代码 Ctrl 同时 即可 取消注释在选中按一遍Ctrl
  • 在 MCU 上运行高级 C++ 软件

    使用 C 开发用户应用程序有很多优势 因此该语言在包括基于 MCU 的系统中变得越来越流行也就不足为奇了 mbed 项目完全专注于这种语言 许多 RTOS 提供 C 兼容层 但与 大 系统 具有 MMU 相比 大多数 RTOS 都有一些限制