嵌入式C与C语言

简介

嵌入式 C"这个概念更多地是指 C 语言在嵌入式系统中的应用,而不是 C 语言本身的语法和特性。

语言标准

无论是普通 C 还是嵌入式 C,它们都遵循相同的 C 语言标准,如 C89、C99 或 C11 等。
从语言规范的角度来看,两者没有本质的区别。

编程模型

嵌入式 C 更多地关注事件驱动、中断处理、状态机等编程模型,以适应嵌入式系统的特点。
而普通 C 则更多地关注面向过程、面向对象等通用编程范式。

开发工具链

嵌入式 C 通常需要使用交叉编译工具链,以生成针对特定硬件平台的可执行代码。
普通 C 则可以使用本地编译器,如 GCC、Clang 等。

硬件适配

嵌入式 C 程序需要关注特定硬件平台的寄存器、外设、内存布局等细节,以充分利用硬件资源。
普通 C 程序则无需过多考虑底层硬件的具体细节。

应用上的 差异性

硬件环境

嵌入式 C 主要用于微控制器、单板计算机等低功耗、受限资源的硬件平台上。
普通 C 语言则更多地用于台式计算机、服务器等较为强大的硬件平台上。

资源限制

嵌入式系统通常拥有较小的内存空间、有限的处理能力和电源供给。
因此,嵌入式 C 需要更加注重内存管理、CPU 利用率以及功耗优化。

实时性要求

许多嵌入式系统需要具备实时响应能力,如工业控制、汽车电子、物联网设备等。
因此,嵌入式 C 更加关注代码的确定性和实时性,而不是程序的灵活性和通用性。

开发工具

嵌入式 C 通常需要使用专门的集成开发环境(IDE)和交叉编译工具链。
这些工具针对特定的硬件平台进行了优化,以满足嵌入式系统的特殊需求。

库函数使用

嵌入式 C 的标准库函数可能与普通 C 语言有所不同,更加精简和针对性。
开发者可能需要自行实现一些常见的功能,如数字 I/O、定时器、中断处理等。

编程模式

嵌入式 C 更加关注事件驱动、状态机、中断处理等编程模式,以更好地适应嵌入式系统的特点。
而普通 C 语言则更加关注面向过程、面向对象等编程范式。

语法上的差异性

头文件引用

嵌入式 C 程序通常需要引用特定于硬件平台的头文件,如 microcontroller 芯片的寄存器定义、底层驱动程序等。
普通 C 程序则更多地使用标准库头文件,如 <stdio.h>、<math.h> 等。

数据类型使用

嵌入式 C 可能会更多地使用固定长度的数据类型,如 int8_t、uint16_t 等,以更好地控制内存占用。
普通 C 则更倾向于使用标准的整型、浮点型等数据类型。

内存管理

嵌入式 C 通常不会使用动态内存分配(如 malloc() 和 free())。
相反,它更多地采用静态内存分配,以避免内存碎片化和性能问题。

编译器选项

嵌入式 C 程序需要针对特定的硬件平台进行交叉编译,因此编译器选项会有所不同。
例如,需要指定目标 CPU 架构、优化级别、内存模型等,以生成最优的机器码。

链接器脚本

嵌入式 C 程序通常需要使用特定的链接器脚本(.ld 文件),以控制程序的内存布局。
这包括代码段、数据段、堆栈等在内存中的映射关系。

启动代码

嵌入式 C 程序通常需要包含特定于硬件平台的启动代码(startup.s 文件),用于完成硬件初始化和环境设置。
这些代码通常由编译器供应商提供,开发者无需自行编写。

实例对比

头文件引用

普通 C:

#include <stdio.h>
#include <math.h>
嵌入式 C:
#include <reg51.h>  // 特定于 8051 微控制器的寄存器定义
#include "uart.h"   // 自定义的串口驱动程序

数据类型使用

普通 C
int main() {int a = 10;float b = 3.14;return 0;
}
嵌入式 C

#include <stdint.h>int main() {uint8_t a = 10;   // 8位无符号整型int16_t b = 314;  // 16位有符号整型return 0;
}
动态内存分配

普通 C:

#include <stdlib.h>int main() {int *ptr = (int *)malloc(sizeof(int));*ptr = 42;free(ptr);return 0;
}
嵌入式 C:
int main() {int a = 42;  // 静态内存分配return 0;
}

编译器选项

普通 C
gcc -Wall -O2 -std=c99 program.c -o program
嵌入式 C
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -Os -ffunction-sections -fdata-sections -Wall program.c -o program.elf

链接器脚本

普通 C

无需特殊的链接器脚本

嵌入式 C
MEMORY
{FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256KRAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
}SECTIONS
{.text :{. = ALIGN(4);*(.text)*(.text*). = ALIGN(4);} >FLASH.data :{. = ALIGN(4);_data = .;*(.data). = ALIGN(4);_edata = .;} >RAM AT>FLASH
}

这些示例展示了普通 C 和嵌入式 C 在头文件引用、数据类型使用、内存管理、编译选项以及链接脚本等方面的一些差异。这些差异主要源于两者面向的硬件环境和应用需求的不同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】 ModuleNotFoundError: No module named datasets

成功解决“ModuleNotFoundError: No module named datasets”错误的全面指南 在Python编程中&#xff0c;遇到ModuleNotFoundError: No module named datasets这样的错误通常意味着Python解释器无法找到名为datasets的模块。datasets是一个流行的Python库&#xff0c;常用于加载…

spring 事务失效的几种场景

一、背景 在 springBoot 开发过程中&#xff0c;我们一般都是在业务方法上添加 Transactional 注解来让 spring 替我们管理事务&#xff0c;但在某些特定的场景下&#xff0c;添加完注解之后&#xff0c;事务是不生效的&#xff0c;接下来详细介绍下。 二、方法不是 public 2…

[leetcode hot 150]第一百三十六题,只出现一次的数字

题目&#xff1a; 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 根据题目关于空间、…

心链9----组队功能开发以及请求参数包装类和包装类实现

心链 — 伙伴匹配系统 组队功能开发 需求分析 理想的应用场景 我要跟别人一起参加竞赛或者做项目&#xff0c;可以发起队伍或者加入别人的队伍 用户可以 创建 一个队伍&#xff0c;设置队伍的人数、队伍名称&#xff08;标题&#xff09;、描述、超时时间 P0 队长、剩余的人数…

漏电保护器的工作原理

漏电保护器上的每月按一次按钮&#xff0c;如果按下后开关立即跳闸&#xff0c;则证明漏保功能良好该按钮的工作原理是模拟线路漏电&#xff0c;在漏保内部存在一个零序互感器&#xff0c;零序互感器分别测量零线和火线的电流值&#xff0c;如果二者数值不相等&#xff0c;零火…

【WEB系列】过滤器Filter

Filter&#xff0c;过滤器&#xff0c;属于Servlet规范&#xff0c;并不是Spring独有的。其作用从命名上也可以看出一二&#xff0c;拦截一个请求&#xff0c;做一些业务逻辑操作&#xff0c;然后可以决定请求是否可以继续往下分发&#xff0c;落到其他的Filter或者对应的Servl…

海报在线制作系统

文章转载自&#xff1a;FastAdmin海报在线制作系统 - 源码1688 应用介绍 介绍 新机构海报是一款基于FastAdminThinkPHP开发的一款新机构海报。 采用JavaScript vue canvas技术&#xff0c;实现在线一键制作海报&#xff0c;生成海报。 功能特性 1、自由创作 2、一键制作…

Django使用正则表达式

本书1-7章样章及配套资源下载链接: https://pan.baidu.com/s/1OGmhHxEMf2ZdozkUnDkAkA?pwdnanc 源码、PPT课件、教学视频等&#xff0c;可以从前言给出的下载信息下载&#xff0c;大家可以评估一下。 在Django框架的新版本&#xff08;v2.0 &#xff09;中&#xff0c;URLc…

文件读取技巧

在CTF&#xff08;Capture The Flag&#xff09;比赛中&#xff0c;PHP文件读取是一种常见的挑战类型&#xff0c;通常涉及利用PHP中的文件包含功能或者一些不安全的文件操作来读取服务器上的敏感文件。这些敏感文件可能包含源代码、配置文件、密码甚至是FLAG&#xff08;比赛的…

ECharts 图形化看板 模板(简单实用)

目录 一、官网 二、模板 ①定义请求​编辑 ② 将请求统一管理&#xff0c;别的页面引用多个请求时更便于导入。​编辑 ③最终模板 三、执行效果 四、后端代码 4.1 controller 4.2 xml 4.3 测试接口 一、官网 获取 ECharts - 入门篇 - 使用手册 - Apache ECharts 二、…

ARM32开发——串口库封装(初级)

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 开发流程分组创建 接口定义完整代码 开发流程 在文件系统中&#xff0c;创建库目录Library在keil工程中&#xff0c;创建分组管理…

Vue3-组件通信详解

文章目录 组件通信的含义Vue3组件通信和Vue2的区别组件通信的具体实现props&#xff08;父子组件通信&#xff09;自定义事件&#xff08;子传父&#xff09;mitt&#xff08;任意组件间通信&#xff09;v-model$attrs &#xff08;非props的父子组件通信&#xff09; r e f s …

知识图谱应用---智慧金融

文章目录 智慧金融典型应用 智慧金融 智慧金融作为一个有机整体&#xff0c;知识图谱提供了金融领域知识提取、融合、分析、推断、决策等功能&#xff0c;如下图所示。在场景方面&#xff0c;智慧金融涵盖智慧支付、智慧财富管理、智慧银行、智慧证券、智慧保险、智慧风控等诸多…

智能分析设备助力废固运输车辆信息采集

进出车辆信息采集&#xff0c;这一环节可谓是整个废固生产及处理企业监管体系中的基石。前端摄像机以其敏锐的感知能力&#xff0c;精准捕捉废固运输车辆的车牌、车头、车尾以及车厢的细致画面&#xff0c;同时记录下对应的视频流信息。这些信息的采集不仅为后续的监管提供了详…

Git存储库的推送保护

Git存储库的推送保护 昨天有一个提交一直提示&#xff1a;Push rejected Push rejected Push master to origin/master was rejected by remote起初在网络上找各种解决办法&#xff0c;先列举以下找到的各类方法 提交用户的用户名和邮箱与Git不一致&#xff0c;这个只需要通…

Warning:成交前,永远相信意外即将发生

作为一名首次次创业者&#xff0c;随着创业进入深层次阶段&#xff0c;越来越感觉到&#xff1a;创业是一条不归路&#xff0c;因为路上不止有惊喜&#xff0c;还有风尘。创业之前我认为世界是“天圆地方”的&#xff0c; 创业后你猜我怎么看这个世界的&#xff1f; 创业前我一…

【C/C++】C语言实现std::move

C语言中的模拟 std::move 在C中&#xff0c;std::move 用于将一个对象转换为右值引用&#xff0c;以便可以使用移动语义。在C语言中&#xff0c;我们可以通过传递指针来模拟这种行为。 #include <stdio.h> #include <stdlib.h>typedef struct {int *data; } Arra…

项目-基于LangChain的ChatPDF系统

问答系统需求文档 一、项目概述 本项目旨在开发一个能够上传 PDF 文件&#xff0c;并基于 PDF 内容进行问答互动的系统。用户可以上传 PDF 文件&#xff0c;系统将解析 PDF 内容&#xff0c;并允许用户通过对话框进行问答互动&#xff0c;获取有关 PDF 文件内容的信息。 二、…

Unity3D DOTS JobSystem物理引擎的使用详解

Unity3D DOTS&#xff08;Data-Oriented Technology Stack&#xff09;是Unity引擎的一项新技术&#xff0c;旨在提高游戏性能和扩展性。其中的Job System是一种用于并行处理任务的系统&#xff0c;可以有效地利用多核处理器的性能。在本文中&#xff0c;我们将重点介绍如何使用…

excel 插入图片不变形的方法

在单元格内插入形状&#xff0c; 设置图片格式 设置图片的高宽