嵌入式系统C编程之堆栈回溯(二)】的更多相关文章

前言 本文作为<嵌入式系统C编程之堆栈回溯>的补充版.文中涉及的代码运行环境如下: 一  异常信号 信号就是软件中断,用于向正在运行的程序(进程)发送有关异步事件发生的信息.Linux应用程序发生异常时,操作系统会产生相应的信号.硬件检测到异常(非法指令.对无效的内存引用等)时也会通知内核,内核将其转换为适当的信号并发给该异常发生时正在运行的进程. 此外,进程可将信号发送给另一进程或进程组(调用kill函数),或向自身发送信号(调用raise函数). 系统中可产生并发送多种类型的信号.在Lin…
转自:https://www.cnblogs.com/clover-toeic/p/3949896.html 前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外,即使出错打印已非常详尽,但仍难以完全预防和处理段违例(Segment Violation)等错误.在没有外部调试器(如gdb server)可用或无法现场调试的情况下,若程序能在突发崩溃时…
前言 在嵌入式系统C语言开发调试过程中,常会遇到各类异常情况.一般可按需添加打印信息,以便观察程序执行流或变量值是否异常.然而,打印操作会占用CPU时间,而且代码中添加过多打印信息时会显得很凌乱.此外,即使出错打印已非常详尽,但仍难以完全预防和处理段违例(Segment Violation)等错误.在没有外部调试器(如gdb server)可用或无法现场调试的情况下,若程序能在突发崩溃时自动输出函数的调用堆栈信息(即堆栈回溯),那么对于排错将会非常有用. 本文主要介绍嵌入式系统C语言编程中,发生…
转自:http://www.cnblogs.com/clover-toeic/p/3919857.html 前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: 一  错误概念 1.1 错误分类 从严重性而言,程序错误可分为致命性和非致命性两类.对于致命性错误,无法执行恢复动作,最多只能在用户屏幕上打印出错消息或将其写入日志文件,然后终止程序:而对于非致命性错误,多数本质上是暂时的(如资源短缺),一般恢复动作是延迟一些时间后再次尝试. 从交互性而言,程序错误…
前言 本文主要总结嵌入式系统C语言编程中,主要的错误处理方式.文中涉及的代码运行环境如下: 一  错误概念 1.1 错误分类 从严重性而言,程序错误可分为致命性和非致命性两类.对于致命性错误,无法执行恢复动作,最多只能在用户屏幕上打印出错消息或将其写入日志文件,然后终止程序:而对于非致命性错误,多数本质上是暂时的(如资源短缺),一般恢复动作是延迟一些时间后再次尝试. 从交互性而言,程序错误可分为用户错误和内部错误两类.用户错误呈现给用户,通常指明用户操作上的错误:而程序内部错误呈现给程序员(可能…
C语言嵌入式系统编程修炼 2008-08-19 作者:宋宝华 来源:天极网 C语言嵌入式系统编程修炼之背景篇 本文的讨论主要围绕以通用处理器为中心的协议处理模块进行,因为它更多地牵涉到具体的C语言编程技巧 不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择.而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系统开发的最佳…
  大学前两年一直搞的是单片机,写的是嵌入式C语言程序,走过了不少弯路,现在感觉仍然在走弯路.有幸偶尔看到了这篇文章,深感自己以前写程序的时候存在很多误区.现写篇博客做下总结. 作者:宋宝华出处:天极网责任编辑: 方舟 [ 2005-06-14 14:45 ] 第一篇 软件架构篇 1.1 模块划分   模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在程序的划分上主要依据功能(依功能进行划分在…
使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法. 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法: #define MIN(A,B) ( A <= B ? A : B ) 正确做法: #define MIN(A,B) ((A)<= (B) ? (A) : (B) ) 对于宏,我们需要知道三点: (1)宏定义"像"函数: (2)宏定义不是函数,因而需要括上所…
数据指针 在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力.在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力.以指针直接操作内存多发生在如下几种情况: (1) 某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址: (2) 两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元(称为mail box)书写内容以在对方CPU产生中断:…
不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力.无疑,汇编语言具备这样的特质.但是,归因于汇编语言开发过程的复杂性,它并不是嵌入式系统开发的一般选择.而与之相比,C语言--一种"高级的低级"语言,则成为嵌入式系统开发的最佳选择.笔者在嵌入式系统项目的开发过程中,一次又一次感受到C语言的精妙,沉醉于C语言给嵌入式开发带来的便利. 图1给出了本文的讨论所基于的硬件平台,实际上,这也是大多数嵌入式系统的硬件平台.它包括两部分: (…
第五章 性能优化   5.1 使用宏定义 在C语言中,宏是产生内嵌代码的唯一方法.对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法.   写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个: 错误做法: #define MIN(A,B) ( A <= B ? A : B ) 正确做法: #define MIN(A,B) ((A)<= (B) ? (A) : (B) )   对于宏,我们需要知道三点: (1)宏定义"像"函数:…
模块划分的"划"是规划的意思,意指怎样合理的将一个很大的软件划分为一系列功能独立的部分合作完成系统的需求.C语言作为一种结构化的程序设计语言,在模块的划分上主要依据功能(依功能进行划分在面向对象设计中成为一个错误,牛顿定律遇到了相对论),C语言模块化程序设计需理解如下概念: (1) 模块即是一个.c文件和一个.h文件的结合,头文件(.h)中是对于该模块接口的声明: (2) 某模块提供给其它模块调用的外部函数及数据需在.h中文件中冠以extern关键字声明: (3) 模块内的函数和全局变…
汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功能:一个提供汉字显示功能的空调的LCD上不需要显示一条"短消息",诸如此类.但是一部手机.小灵通则通常需要包括较完整的汉字库. 如果包括的汉字库较完整,那么,由内码计算出汉字字模在库中的偏移是十分简单的:汉字库是按照区位的顺序排列的,前一个字节为该汉字的区号,后一个字节为该字的位号.每一个…
第3章 屏幕操作   3.1 汉字处理 现在要解决的问题是,嵌入式系统中经常要使用的并非是完整的汉字库,往往只是需要提供数量有限的汉字供必要的显示功能.例如,一个微波炉的LCD上没有必要提供显示"电子邮件"的功能:一个提供汉字显示功能的空调的LCD上不需要显示一条"短消息",诸如此类.但是一部手机.小灵通则通常需要包括较完整的汉字库.   如果包括的汉字库较完整,那么,由内码计算出汉字字模在库中的偏移是十分简单的:汉字库是按照区位的顺序排列的,前一个字节为该汉字的区…
一. Linux嵌入式系统 操作系统是一种在计算机上运行的软件,它的主要任务是管理计算机上的系统资源,为用户提供使用计算机及其外部设备的接口.它存在的目的是为了管理所有硬件资源,并且提供应用软件一个合适的操作环境.嵌入式系统由于硬件的先天限制,经常只具有极稀少的硬件资源,如 时脉较少的 CPU.较少的内存.常不具有磁盘而用小容量的DiskOnChip或DiskOnModule.而在使用电池的系统中,它还要实现节省电池消耗,延长电池使用时间的功能. Linux 作为嵌入式操作系统是完全可行的,因为…
目录 一. 嵌入式体系结构 二. 开发过程中的分工 三. 嵌入式软件体系结构 四. 嵌入式Linux 一. 嵌入式体系结构 <嵌入式系统设计师教程>这本书的前三章脉络很清晰, 按照嵌入式系统结构从下往上, 从底层的硬件, 电路, 到上层的系统, 应用, 逐层展开介绍. 书的后三章是在掌握好前面的基础后, 对于应用开发, 软件工程等宏观上的指导. 我根据前三章的结构画出了图1.1的嵌入式系统结构图, 系统分层结构一目了然. 第三层多出来的Linux和四大块, 后面再介绍. 图1.1 二. 开发过…
个牛人在ARM实现嵌入式系统的过程 第一章  概览 1.1课程概览 认识ARM嵌入式系统(什么是ARM?什么是嵌入式系统?) 备战智能车 在科技活动中玩起来 积累计算机.电路基础知识 1.2如何学好嵌入式系统 兴趣 热爱 玩起来 第二章  绪论 2.1计算机的基本概念.发展历史 改变世界:机械之美——机械时期的计算设备 Turing machine ABC 冯.诺依曼体系结构 进制转换ASCIItab 数字(digital  discrete如:指针走过变盘)与模拟(analog  contin…
系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用程序的影响,能够在编写高级语言代码的同时,思考低层次的影响与优化,即能够在系统层级进行编程及程序的优化. 编译系统的组成 一个程序的生命周期从高级语言的编写开始,然后被转化为一系列的低级机器语言指令,这些指令按照一种称为可执行目标程序的格式打包,并以二进制磁盘文件的形式存储起来. Unix系统中,这…
一.嵌入式系统的概念 着重理解"嵌入"的概念 ,主要从三个方面上来理解. 首先,从硬件上,"嵌入"是基于CPU的处围器件的,整合到CPU芯片内部,就好比早期基于X86体系结构下的计算机,CPU有的是运算器和累加器的功能,一切芯片要通过外部桥路来扩展实现,象串口之类的都是凭借着外部的16C550/2的串口控制器芯片实现,而目前的这种串口控制器芯片早已集成到CPU内部,而且PC机有独立的显卡,而多数嵌入式处理器都带有LCD控制器,就其意义来说就相当于显卡. 从软件上来说…
ARM Cortex-M嵌入式C基础编程(下) ARM Cortex-M Embedded C Fundamentals/Tutorial -Aviral Mittal Load Region Vs Execution Region: 现在这意味着代码或代码的某些部分可能有不同的地址用于将它们加载到存储器中,例如,当它们加载到ROM中时,以及当它们被执行时.加载程序的地址称为其"加载地址",执行程序的地址称为其执行地址. 现在很明显,如果程序的加载地址或程序的某一部分的加载地址与它们各…
ARM Cortex-M嵌入式C基础编程(上) ARM Cortex-M Embedded C Fundamentals/Tutorial -Aviral Mittal 此技术是关于从编写简单的嵌入式C代码到执行的过程. 这项技术试图不使用行话,并针对任何人谁有兴趣知道如何开始编写一个嵌入式C程序或ARM Cortex-M系列处理器的汇编语言程序. 世界上充斥着信息,然而这些信息的存在方式使得所有的信息对于一个来自其他背景的人来说都是垃圾.例如,如果您来自硬件背景,则软件信息看起来很神秘.例如,…
硬件资料: 操作系统:(非虚拟机) zws@z-pc:~$ lsb_release -aNo LSB modules are available.Distributor ID: Ubuntu Description: Ubuntu LTS Release: 14.04 Codename: trusty 内核版本: zws@z-pc:~$ uname -a Linux z-pc --generic #~-Ubuntu SMP Tue Sep :: UTC x86_64 x86_64 x86_64…
阴沟翻船,马失前蹄,说明凡事皆有可能.自然,程序设计的再好,也会有crash的时候.开发期还还说,正式交付的系统crash自然更是难以承受的.无论何时,死一次就够了,得有方法查个水落石出. 几年前哥去广州的一家民企呆过些日子.刚到那,就碰上系统毫无线索的crash.咋办?哥想静下心来,花点时间做个工具去定位,但无奈硬件出生的领导天天赶着大家守在机房.唉,无知啊,天天守在机房,面对crash,哥想到的只有我儿子常常念的诗--来如春梦不多时,去如朝霞无觅处.嗯,crash,哥只能数数又crash了几…
嵌入式系统Linux内核开发工程师必须掌握的三十道题 如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师,试试看! 1) Linux中主要有哪几种内核锁? Linux的内核锁主要是自旋锁和信号量. 自旋锁最多只能被一个可执行线程持有,如果一个执行线程试图请求一个已被争用(已经被持有)的自旋锁,那么这个线程就会一直进行忙循环——旋转——等待锁重新可用.要是锁未被争用,请求它的执行线程便能立刻得到它并且继续进行.自旋锁可以在任何时刻防止多于一个的执行…
本文转载自:http://blog.csdn.net/xteda/article/details/6575278 (作者 冯青华 信庭嵌入式工作室(www.xteda.com)- CEO Blog:http://blog.csdn.net/fqheda )                                 <转载请注名来路> Technorati 标签: GUI 模块介绍 --------------------------------------------我是分割线-----…
转载:http://www.ibm.com/developerworks/cn/linux/l-btloader/index.html   1. 引言 在专用的嵌入式板子运行 GNU/Linux 系统已经变得越来越流行.一个嵌入式 Linux 系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(firmware)中的 boot 代码(可选),和 Boot Loader 两大部分. 2. Linux 内核.特定于嵌入式板子的定制内核以及内核的启动参数. 3. 文件系统.包…
嵌入式系统烧写uboot/bootloader/kernel的一般方法   本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误,  www.2cto.com   引导失败等情况时如何重新烧写uboot/kernel.   烧写uboot/kernel的方式一般有两种,一种是在linux本身(shell中),直接将uboot/kernel的影像文件(二进制文件)使用操作烧写flash的命令烧写到flash特定分区上,   另一…
http://www.tinylab.org/using-qemu-simulation-inserts-the-type-system-to-produce-the-whole-process/ 利用qemu模拟嵌入式系统制作全过程 by Pingbo Wen of TinyLab.org 2013/08/31 这篇文章,将介绍如何用qemu来搭建一个基于ARM的嵌入式linux系统.通过该文章,你可以学习到如何配置kernel,如何交叉编译 kernel,如何配置busybox并编译,如何制…
嵌入式linux多进程编程 在主程序显示文本菜单.提供例如以下服务.要求每一个服务都通过生成子进程来提供. 服务包含:日历信息显示,日期信息显示,推断闰年服务,文件复制功能,数字排序功能.退出功能. 代码和文档(有流程图的下载地址):http://download.csdn.net/download/jingjingxujiayou/7540893 #include <stdio.h> #include <sys/types.h> #include <unistd.h>…
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日之功) 继上四篇:ORACLE PL/SQL编程之八:把触发器说透                ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)                [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) [推荐]…