当前位置:首页 > 单片机 > 单片机
[导读] 通过CMSIS-utrealos项目中的CTBUG调试,使我对裸机C编程加深了认识。那个BUG调试,现象是出现hard fault,但是fault出现地的汇编指令看着貌似没啥问题,解决一处的fault后,其他处又出现fault了。最后我看到原来是

 通过CMSIS-utrealos项目中的CTBUG调试,使我对裸机C编程加深了认识。那个BUG调试,现象是出现hard fault,但是fault出现地的汇编指令看着貌似没啥问题,解决一处的fault后,其他处又出现fault了。最后我看到原来是fault出现地的指令中源地址错误了,源地址应该在数据段中,却意外地落到了代码段中。这个现象我忙活了半天才找到。

然后通过看那奇怪的源地址,对照它四周的现象代码,最终才发现是我的demo C文件中的头文件包含错误了(这个错误显然易见,但是在review代码时却没发现)。导致该问题指令的那个源地址计算错误,落到了代码段中。

调试时间花了不少,最后这段调试经历使我对裸机C编程发生了兴趣,从而认真读了armcm3编程权威指南一书。

还有王SAN那个栈溢出调试,王SAN本来还想研究是否是内存分配方面的错误,但是和我最后讨论后,结果用arm权威指南及我们组项目笔记文章中的那个栈溢出调试方法,很快就找出BUG原因了。

我的那个BUG调试告诉我ARMCM3上没有MMU那种保护功能,也没有操作系统(linux操作系统中的那种开启MMU保护以及虚存访问权限检查的功能这里没有)。虽然有MPU,但是这个是可选器件。

linux下的MMU及虚存保护,使得我们PC机编程中,可以不用C指针时,及时将其置为空从而起到保护程序的作用,但是回到裸机下,尤其没MMU部件时,空指针的作用意义在这里都消失了。这也就是嵌入式编程的复杂性。

但是通过嵌入式编程,尤其王san那个BUG调试,毕竟能加深对C编程底层调试的认识。比如现在嵌入式调试,可以直接通过观看内存地址处的数据信息是否异常,各个汇编指令和cpu寄存器值变化是否异常,嵌入式调试使人真正回到了二进制时代。

不可否认,MMU和虚拟存储的设计,真正简化了上层程序的设计,提供给用户一个好的开发应用程序的界面。详情见uclinux与linux的不同一文。

但是由于MMU的存在必要,这延缓了CPU访问内存的速度。为了解决这一问题,又带来cache,还有TLB(之前作linux性能检证搞过TLB的性能分析一文可以参考)。而ARM CM3中没有这一切,毕竟cortex-m3和A5的应用范围是不同的。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

在SC 19大会上,Intel正式宣布了Xe架构的GPU及10nm工艺的新一代至强可扩展处理器(代号Sapphire Rapids),2021年问世的Aurora极光百亿亿次超算将承载Intel在HP

关键字: cache Intel 计算 兰博 rambo hpc

Cache为接口类。ShardedLRUCache继承自Cache,实现了Cache中的缓存操作方法。ShardedLRUCache封装了16个LRUCache缓存片,每次对缓存的读取、插入、查找、删

关键字: cache lrucache

【转】mini2440裸机开启MMU实验 .text .global _start _start:     ldr sp, =4096                       @ 设置栈指针

关键字: mmu 裸机

原理LeetCode上有着样一道题目:Design and implement a data structure for Least Recently Used (LRU) cache. It sho

关键字: cache 算法 lru

阅读本博客可参考:LevelDB源码分析之十一:cacheLevelDB源码分析之十二:blockLevelDB源码分析之十三:table由上面这三篇博客可知,LevelDB的Cache分为两种,分别

关键字: cache tablecache

在2004年写的一篇文章x86汇编语言学习手记(1)中,曾经涉及到gcc编译的代码默认16字节栈对齐的问题。之所以这样做,主要是性能优化方面的考虑。  大多数现代cpu都one-die了

关键字: cache coherence CPU 嵌入式处理器

#include "def.h"#include "option.h"#include "2410addr.h"#include "2410lib.h...

关键字: arm9 mmu

一、背景 FS2410 开发板上的 ARM 核心为 ARM920T, ARM920T 代表着什么呢? 其实ARM920T = ARM9 core + MMU + Cache,也就是说 ARM920T 为实现虚拟内存管理提...

关键字: mmu arm920t架构

一、映像文件基本组成映像文件加载时域包括RO和RW段,运行时域则包括RO、RW和ZI三个段。其中RO和RW段的内容在加载时和运行时是一样的,只是存储空间可能不同,而ZI段则是运行时由初始化函数创建的。 RO段:Read-...

关键字: ARM mmu 地址重映射

一、背景 FS2410 开发板上的 ARM 核心为 ARM920T, ARM920T 代表着什么呢? 其实ARM920T = ARM9 core + MMU + Cache,也就是说 ARM920T 为实现虚拟内存管理提...

关键字: fs2410 mmu 虚拟内存管理
关闭
关闭