Tag: 嵌入式

浮点运算中的flush-to-zero行为

虽然,据我所知,IEEE 754没有提及关于刷新到零模式来更快地处理非规范化数字 ,但是一些架构提供了这种模式(例如http://docs.sun.com/source/806-3568/ncg_lib .html )。 在本技术文档的特定情况下,非规范化数字的标准处理是默认值,并且必须明确激活flush-to-zero。 在默认模式下,非规范化数字也在软件中处理,这比较慢。 我在嵌入式C的静态分析器上工作,试图预测在运行时可能发生的值的正确(如果有时是不精确的)范围。 它的目的是正确的,因为它可用于排除在运行时出现错误的可能性(例如对于关键的嵌入式代码)。 这需要在分析期间捕获所有可能的行为,因此在浮点计算期间产生所有可能的值。 在这方面,我的问题是双重的: 在嵌入式架构中,是否存在仅提供从零到零的架构 ? 他们可能没有权利将自己宣传为“IEEE 754”,但可以提供足够接近IEEE 754风格的浮点运算。 对于在嵌入式环境中提供两者的体系结构, 可能不会被系统激活为零 ,以使反应时间更可预测(这些嵌入式系统的常见约束)? 在我用于浮点值的区间运算中处理flush-to-zero非常简单,如果我知道我必须这样做,我的问题是我是否必须这样做。

sprintf或printf的最小实现

我正在研究一种速度至关重要的嵌入式DSP,而且内存很短。 目前,sprintf使用我代码中任何函数的大部分资源。 我只用它来格式化一些简单的文本: %d, %e, %f, %s ,没有精确或奇异的操作。 如何实现更适合我的使用的基本sprintf或printf函数?

如何在Raspberry Pi上运行没有操作系统的C程序?

我想尝试将Raspberry Pi用于一些不同的低级嵌入式应用程序。 唯一的问题是,与可用的AVR和PIC微控制器板不同,Raspberry Pi通常运行一个操作系统(如Raspbian),它在所有正在运行的程序中分配CPU时间,并使其对某些实时应用程序不切实际。 我最近了解到,假设你有一个像GRUB一样的bootloader,在x86上运行一个C程序(以内核的forms)只需要很少的实际设置,只需要一个汇编程序来调用main函数和实际的C代码。 有没有办法用Raspberry Pi实现这一目标? 这是学习低级ARM编程的好方法,它已经有一些复杂的外围设备(USB,以太网等)

编写固件:汇编还是高级?

相关: 测试固件 启动微控制器模拟器/仿真器 解释汇编代码 如果您正在为微控制器编写代码,那么如果您使用汇编语言或C语言或其他高级语言编写,会有真正的区别吗? 如果您编写C代码,您将如何编译它? 谢谢

如何在Stellaris中的程序之间跳转

我正在为Stellaris LM3S1607芯片开发一个引导加载程序。 我正在使用Keil MicroVision4 C编译器。 我们的想法是创建2个独立的固件,一个将更新另一个。 在firmware1中,我下载了firmware2文件并将其写入地址0x3200的闪存中。 直到这里它才有效。 我还validation了数据写入闪存是否正确。 现在我在flash中有两个应用程序。 一个是我的uip引导装载程序,而seoncd就是我的主要项目。 我想知道如何从第一个程序跳转到位于0x3200的第二个程序。 如果有人能帮我跳,那就太好了。 谢谢

嵌入式硬件测试自动化

有没有人成功地直接在嵌入式硬件上进行测试? 具体来说,我正在考虑为硬件层模块自动化一系列unit testing。 我们需要对硬件层代码更有信心。 我们的很多项目都使用中断驱动的定时器,ADC,串行io,串行SPI器件(闪存)等。 这甚至值得努力吗? 我们通常针对: 处理器:8位或16位微控制器(某些DSP产品) 语言:C(有时是c ++)。

堆栈大小估计

在multithreading嵌入式软件(用C或C ++编写)中,必须为线程提供足够的堆栈空间,以使其能够完成其操作而不会溢出。 在某些实时嵌入式环境中,正确调整堆栈大小至关重要,因为(至少在我使用过的某些系统中),操作系统不会为您检测到这一点。 通常,在创建线程时(即在pthread_create()等的参数中)指定新线程(除主线程之外)的堆栈大小。 通常,这些堆栈大小被硬编码为在最初编写或测试代码时已知良好的值。 但是,未来对代码的更改通常会破坏硬编码堆栈大小所依据的假设,并且在一个重要的日子里,您的线程进入其调用图的较深分支之一并溢出堆栈 – 从而导致整个系统崩溃或者默默地腐蚀记忆。 在线程中执行的代码在堆栈上声明struct实例的情况下,我个人已经看到了这个问题。 当结构体被扩充以容纳额外数据时,堆栈大小会相应地膨胀,从而可能发生堆栈溢出。 我想这对于已建立的代码库来说可能是一个巨大的问题,其中无法立即知道向结构添加字段的全部效果(太多的线程/函数来查找使用该结构的所有位置)。 由于对“堆栈大小”问题的通常响应是“它们不可移植”,因此我们假设编译器,操作系统和处理器都是此调查的已知数量。 我们也假设没有使用递归,所以我们没有处理“无限递归”场景的可能性。 有哪些可靠的方法可以估算线程所需的堆栈大小? 我更喜欢离线(静态分析)和自动方法,但欢迎所有想法。

在位上旋转8×8块中的位的最快方法是什么?

我不确定我正在尝试做什么的确切术语。 我有一个以8 bytes字节存储的8×8 bits块,每个字节存储一行。 当我完成后,我希望每个字节存储一列。 例如,当我完成时: Byte0out = Byte0inBit0 + Byte1inBit0 + Byte2inBit0 + Byte3inBit0 + … Byte1out = Byte0inBit1 + Byte1inBit1 + Byte2inBit1 + Byte3inBit1 + … 在C中表现良好的最简单方法是什么?

仅限C ++前端编译器(将C ++转换为C)

我目前正在管理从单个源代码树(Win32,Linux,Verifone CC终端,MBED甚至Nintendo GBA / DS)在多个平台上运行的一些C ++代码。 但是,我需要构建一个针对没有C ++编译器(仅限C)的嵌入式平台的应用程序。 我重申许多早期的C ++编译器只是在现有C编译器(例如Glockenspiel使用MSC)上的前端。 今天使用的任何这样的“前端”C ++编译器是否会生成C代码。 Tools Platform ———– ———— ______Visual C++ _____ WIN32 / /_______MBED (ARM)_______MBED (ARM dev board). / /_________GCC (x86)________Linux / Source____/___________GCC (ARM)________GBA/DS \ \__________SDA______________Verifone Verix CC Terminals \ \________ARM SDT__________Verifine VerixV CC terminals \ \______????_____________Renases M8/16/32. \ \____????_____________Z8 family. 最后两个平台我有很好的C编译器,但没有C ++。 正如您所看到的,我支持各种各样的平台,并且共享大量的库代码(以及一些应用程序代码)。

在主程序和C中的ISR之间共享volatile变量是否安全?

在主程序和C中的ISR之间共享一个对齐的整数变量(不大于处理器自然字,使用volatile限定符)是否安全? 是否保证不会发生撕裂的读写操作?