嵌入式知识点总结 ARM体系与架构 专题提升(四)-编程

 针对于嵌入式软件杂乱的知识点总结起来,提供给读者学习复习对下述内容的强化。

目录

1.嵌人式编程中,什么是大端?什么是小端 ?

2.如何判断计算机处理器是大端,还是小端 ?

3.如何进行大小端的转换 ?

4.如何对绝对地址0x100000赋值?


1.嵌人式编程中,什么是大端?什么是小端 ?

在嵌入式编程中,大端和小端是字节序(Byte Order)的概念,用于描述多字节数据在内存中的存储方式。

大端存储是指将数据的高字节存储在低地址,低字节存储在高地址的一种方式。

假设有一个32位整数 0x12345678,在内存中的存储方式如下(地址从小到大):

地址数据(字节值)
0x000x12
0x010x34
0x020x56
0x030x78

特点:数据从高字节到低字节依次存储。

小端存储是指将数据的低字节存储在低地址,高字节存储在高地址的一种方式。

同样的32位整数 0x12345678,在内存中的存储方式如下(地址从小到大):

地址数据(字节值)
0x000x78
0x010x56
0x020x34
0x030x12

特点:数据从低字节到高字节依次存储。

大端

通常用于网络传输(网络字节序)。

更符合人类阅读习惯(从高位到低位)。

小端

大多数嵌入式设备和PC(如Intel、ARM)采用小端存储。

存储和访问数据时效率更高(低地址直接存储低字节)。

2.如何判断计算机处理器是大端,还是小端 ?

#include <stdio.h>

int main() {
    unsigned int x = 0x12345678;  // 一个32位整数
    unsigned char *ptr = (unsigned char *)&x; // 取x的地址并转为字节指针

    if (*ptr == 0x78) {
        printf("Little-Endian (小端模式)\n");
    } else if (*ptr == 0x12) {
        printf("Big-Endian (大端模式)\n");
    } else {
        printf("Unknown Byte Order\n");
    }

    return 0;
}

如果输出Little-Endian (小端模式),说明低字节存储在低地址(小端)。

如果输出Big-Endian (大端模式),说明高字节存储在低地址(大端)。

补充:*ptr存的起始地址嘛

3.如何进行大小端的转换 ?

大小端的转换是指在内存中交换数据的字节顺序,将大端存储格式转换为小端存储格式,或反之。这通常用于跨平台数据通信、存储格式兼容性处理等场景。

通过按位操作手动调整字节顺序。

#include <stdio.h>

unsigned int swap_endian(unsigned int x) {
    return ((x & 0xFF000000) >> 24) | // 高8位 -> 低8位
           ((x & 0x00FF0000) >> 8)  | // 次高8位 -> 次低8位
           ((x & 0x0000FF00) << 8)  | // 次低8位 -> 次高8位
           ((x & 0x000000FF) << 24);  // 低8位 -> 高8位
}

int main() {
    unsigned int x = 0x12345678;
    unsigned int y = swap_endian(x);
    printf("Original: 0x%x\n", x);
    printf("Converted: 0x%x\n", y);
    return 0;
}
Original: 0x12345678
Converted: 0x78563412

4.如何对绝对地址0x100000赋值?

通过将绝对地址类型转换为指针并进行解引用,可以对该地址赋值。

#include <stdio.h>

int main() {
    unsigned int *addr = (unsigned int *)0x100000; // 将绝对地址0x100000转为指针
    *addr = 0x12345678;                            // 向地址写入值
    printf("Value at 0x100000: 0x%x\n", *addr);    // 打印地址中的值
    return 0;
}

地址合法性

需要确保 0x100000 是有效的内存地址。

该地址可能位于特定设备寄存器区域(如外设地址)或已映射的内存区域。

使用无效地址会导致段错误 (Segmentation Fault) 或异常。

访问权限

确保程序有权访问该地址,某些地址可能需要特定的权限(如特权模式下的访问)。

编译器优化

某些编译器可能会优化掉对特定地址的操作。如果是硬件相关的地址访问,建议将指针声明为 volatile,以防止编译器优化。

volatile unsigned int *addr = (unsigned int *)0x100000;

操作系统影响

在裸机(无操作系统)开发环境中,直接访问绝对地址通常是可行的。

在操作系统(如 Linux)中,用户态程序无法直接访问绝对物理地址,需通过内核驱动或内存映射接口(如 mmap)实现。

如果是在 Linux 用户态下操作绝对地址,可以使用 mmap 进行内存映射。

#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <unistd.h>

#define PHYS_ADDR 0x100000  // 物理地址
#define MAP_SIZE  0x1000    // 映射大小

int main() {
    int fd = open("/dev/mem", O_RDWR | O_SYNC); // 打开物理内存设备
    if (fd < 0) {
        perror("open /dev/mem failed");
        return -1;
    }

    void *mapped_addr = mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PHYS_ADDR);
    if (mapped_addr == MAP_FAILED) {
        perror("mmap failed");
        close(fd);
        return -1;
    }

    volatile unsigned int *addr = (unsigned int *)mapped_addr;
    *addr = 0x12345678; // 写入值
    printf("Value at 0x100000: 0x%x\n", *addr);

    munmap(mapped_addr, MAP_SIZE); // 解除映射
    close(fd);
    return 0;
}

在裸机开发中,直接使用指针操作即可对绝对地址赋值。

在操作系统中,需要通过内核支持(如 /dev/memmmap)访问物理地址。

对硬件地址操作时,请确保地址的合法性和访问权限,并根据需要使用 volatile 关键字防止优化。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ansys Thermal Desktop 概述

介绍 Thermal Desktop 是一种用于热分析和流体分析的通用工具。它可用于组件或系统级分析。 来源&#xff1a;CRTech 历史 Thermal Desktop 由 C&R Technologies (CR Tech) 开发。它采用了 SINDA/FLUINT 求解器。SINDA/FLUINT 最初由 CR Tech 的创始人为 NASA 的约翰逊航…

Python vLLM 实战应用指南

文章目录 1. vLLM 简介2. 安装 vLLM3. 快速开始3.1 加载模型并生成文本3.2 参数说明 4. 实战应用场景4.1 构建聊天机器人示例对话&#xff1a; 4.2 文本补全输出示例&#xff1a; 4.3 自定义模型服务启动服务调用服务 5. 性能优化5.1 GPU 加速5.2 动态批处理 6. 总结 vLLM 是一…

计算机网络 (60)蜂窝移动通信网

一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于&#xff0c;将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域&#xff0c;称为蜂窝小区。每个小区设置一个基站&#xff0c;负责本小区内移…

从63 秒到 0.482 秒:深入剖析 MySQL 分页查询优化

在日常开发中&#xff0c;数据库查询性能问题就像潜伏的“地雷”&#xff0c;总在高并发或数据量庞大的场景下引爆。尤其是当你运行一条简单的分页查询时&#xff0c;结果却让用户苦苦等待&#xff0c;甚至拖垮了系统。这种情况你是否遇到过&#xff1f; 你可能会想&#xff1…

Word 中实现方框内点击自动打 √ ☑

注&#xff1a; 本文为 “Word 中方框内点击打 √ ☑ / 打 ☒” 相关文章合辑。 对第一篇增加了打叉部分&#xff0c;第二篇为第一篇中方法 5 “控件” 实现的详解。 在 Word 方框内打 √ 的 6 种技巧 2020-03-09 12:38 使用 Word 制作一些调查表、检查表等&#xff0c;通常…

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…

7-Zip高危漏洞CVE-2025-0411:解析与修复

7-Zip高危漏洞CVE-2025-0411&#xff1a;解析与修复 免责声明 本系列工具仅供安全专业人员进行已授权环境使用&#xff0c;此工具所提供的功能只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利…

百度APP iOS端磁盘优化实践(上)

01 概览 在APP的开发中&#xff0c;磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长&#xff0c;如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验&#xff0c;详细介绍iOS沙盒环境下的文件存储规范&#xff0c;探讨业务缓…

Markdown Viewer 浏览器, vscode

使用VS Code插件打造完美的MarkDown编辑器&#xff08;插件安装、插件配置、markdown语法&#xff09;_vscode markdown-CSDN博客 右键 .md 文件&#xff0c;选择打开 方式 &#xff08;安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…

批量创建ES索引

7.x from elasticsearch import Elasticsearch# 配置 Elasticsearch 连接 # 替换为你的 Elasticsearch 地址、端口、用户名和密码 es Elasticsearch([http://10.10.x.x:43885],basic_auth(admin, XN272G9THEAPYD5N5QORX3PB1TSQELLB) )# # 测试连接 # try: # # 尝试获取集…

Kimi 1.5解读:国产AI大模型的创新突破与多模态推理能力(内含论文地址)

文章目录 一、Kimi 1.5的核心技术创新&#xff08;一&#xff09;长上下文扩展&#xff08;Long Context Scaling&#xff09;&#xff08;二&#xff09;改进的策略优化&#xff08;Improved Policy Optimization&#xff09;&#xff08;三&#xff09;简化框架&#xff08;S…

数据结构 栈

目录 前言 一&#xff0c;栈的基本介绍与定义 二&#xff0c;数组实现栈 三&#xff0c;链表实现栈 四&#xff0c;栈的应用 总结 前言 我们学习了链表&#xff0c;接下来我们就来学习栈&#xff0c;我将会从栈的介绍到实现栈与栈的全部的功能 一&#xff0c;栈的基本介绍…

用Python绘制一只懒羊羊

目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…

Couchbase UI: Indexes

在Couchbase中&#xff0c;索引的这些指标可以帮助你评估索引的性能和状态。下面是每个指标的详细解释&#xff0c;以及如何判断索引的有效性&#xff1a; 1. Index Name&#xff08;索引名称&#xff09; 描述&#xff1a;每个索引都有一个唯一的名称。这个名称通常会包括表…

修改maven的编码格式为utf-8

1.maven默认编码为GBK 注:配好MAVEN_HOME的环境变量后,在运行cmd. 打开cmd 运行mvn -v命令即可. 2.修改UTF-8为默认编码. 设置环境变量 变量名 MAVEN_OPTS 变量值 -Xms256m -Xmx512m -Dfile.encodingUTF-8 3.保存,退出cmd.重新打开cmd 运行mvn -v命令即可. 源码获取&…

Visual Studio Code修改terminal字体

个人博客地址&#xff1a;Visual Studio Code修改terminal字体 | 一张假钞的真实世界 默认打开中断后字体显示如下&#xff1a; 打开设置&#xff0c;搜索配置项terminal.integrated.fontFamily&#xff0c;修改配置为monospace。修改后效果如下&#xff1a;

MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log

文章目录 一、前言1.1 MySQL体系结构1.2 MySQL日志分类1.3 其他几种日志1.3.1 查询日志1.3.2 慢查询日志1.3.3 错误日志 二、bin log 二进制日志2.1 bin log简介2.2 binlog日志格式2.3 日志删除2.4 写入/刷盘机制 三、undo log 回滚日志3.1 undo log简介3.2 隐藏字段 —— 事务…

electron打包客户端在rk3588上支持h265硬解

目录 前言 chromium是如何支持h265硬解 electron/chromium第一次编译 electron/chromium第二次编译 前言 我们的客户端程序是用electron打包的前端程序&#xff0c;其在rk3588主机上的linux环境运行。之前使用客户端查看h264编码的视频直播是没有问题的&#xff0c;但视频源…

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…

DRG_DIP 2.0时代医院程序结构转型与数据结构优化研究

一、引言 1.1 DRG_DIP 2.0 改革背景与意义 医保支付方式改革在医疗保障制度改革中占据着极为关键的地位,是推动医疗领域变革的核心力量。它犹如一把精准的手术刀,对医疗资源的合理分配、医疗服务质量的稳步提升以及医疗费用的有效控制起着决定性作用。在这一改革进程中,DR…