Tag: 嵌入式

如何在ARM处理器上检测冷启动与热启动?

我正在寻找一种方法来确定ARM处理器是从冷启动(即初始上电)到热启动(即没有实际功率损耗的复位断言)启动。 具体来说,我正在使用ARM968内核,将使用C或汇编进行确定,我将使用该确定,因此某些操作仅在初始上电时运行,而不是在后续复位时运行。 在之前的项目中,我利用外部电路(例如FPGA)来检测不同的启动方案,但在这种情况下,我仅限于ARM内核。

Linux中的COM端口检测

请告诉我是否有任何API,系统调用,function(在Linux中),我可以使用我的C程序动态检测COM端口,即,只要在端口中插入USB调制解调器加密狗,我就能检测到COM端口在我的C程序中使用API​​,系统调用或函数。

如何计算浮点支持较差的处理器上GPS坐标之间的距离?

我需要计算GPS坐标之间的距离来计算行进距离。 我已经尝试了Haversine和Vincenty算法,它们在我的桌面PC上运行良好,但是当我将代码移植到dsPIC时,由于缺少浮点精度,它们返回0表示接近(几米之内)的点和罪和cos的不良实现。 对于我的用例,我的分数不会超过10米,并且都将相距不超过10公里。 我尝试了以下算法,结果似乎没问题: double dist(double latA, double lonA, double latB, double lonB) { double latD = fabs(latA – latB) * 111.3; double lonD = fabs(lonA – lonB) * 111.3 * cos(latA * 3.14159265 / 180); return sqrt(latD*latD + lonD*lonD) * 1000; } 假设每1°的距离是111.3km,我用毕达哥拉斯定理来计算距离。 有没有简单的方法来改进我的算法? 或者是否有其他算法不依赖于高度准确的sin / cos?

是否需要在退出前关闭文件描述符?

当然,大多数情况的直接答案是“是” ,我坚信一个进程应该正确清理它已分配的任何资源,但我的情况是一个长期运行的系统守护进程打开一个固定的启动时的文件描述符数量,并在退出前将它们全部关闭。 这是一个嵌入式平台,我正在努力使代码尽可能紧凑,同时不引入任何不良风格。 但是,由于文件描述符无论如何都会在退出之前关闭,这个文件描述符清理代码是否可以用于任何目的? 你总是关闭所有文件描述符吗?

什么使SPI比I2C协议更快

我知道I2C和SPI通信的基本知识。 由于两者都是同步协议。 我想知道是什么让SPI比I2C更快。 如果我没有使用I2C,我们可以使用400kbps,而在SPI中我们也可以达到10mbps。 是因为硬件变化了吗? 在一次采访中我问过这个问题。如果我错了,请告诉我。

嵌入式系统中的malloc

我正在使用嵌入式系统。 该应用程序在AT91SAMxxxx和cortex m3 lpc17xxx上运行。 我正在研究动态内存分配,因为它会极大地改变应用程序的面貌(并给我更多的权力)。 我认为我唯一真正的路线是为堆设置一个内存区域,并设计一个最适合(双关)我的目的的定制malloc。 在查看不同的内存分配算法时,你不能偶然发现Doug Lea的malloc。 我认为这已经在我的嵌入式系统中使用过,那里没有操作系统和量身定制的版本,比如提供了sbrk()函数来实现这一目标。 我试图找到很好的例子来实现这个目标,或者在我开始编写自己的概念之前尝试一个概念validation。 是否可以在我的系统中使用dlmalloc? 如果有,是否有人可以指向相关资源? (找不到很多帮助我的人) 是不是更好地去编写我自己的malloc来满足我的需求? 并且道歉我到目前为止的大多数研究都是设计一个不使用道格的malloc,这是一个不同的挑战。 猜猜我试图找出更深入地研究这条路线是浪费时间。 编辑: 这个故事的寓意:在我的案例中看dlmalloc毫无意义。

“static / extern uint8_t array = {0};”是否符合ANSI C规范?

我对以下代码有疑问: #include “all_needed.h” static uint8_t array[2] = {0}; void main(void) { … } 是否允许(模块)全局数组如上所述进行初始化,以使每个成员在ANSI C符合时设置为零? 我在Code Composer 5(MSP430项目)中遇到了问题,我不得不将其更改为 static uint8_t array[2] = {0, 0}; 用于正确初始化arrays的第二个成员。

GCC中-O0和-O1之间的差异

编译一些代码时,我注意到在-O0和-O1之间创建的汇编程序存在很大差异。 我想要启动启用/禁用优化,直到我发现导致汇编程序发生某些变化的原因。 如果我使用-fverbose-asm来确切地找出O1与O0相比启用了哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然如此大不同? 即使我用O0运行gcc并手动添加fverbose-asm所说的用O1启用的所有标志,我也没有得到与使用O1时相同的汇编程序。 除了’-f …’和’-m ……’之外还有什么可以改变的吗? 或者只是’O1’与无法关闭的’O0’相比具有一定的魔力。 对于含糊不清的内容感到抱歉 – 这与使用GCC + ARM减少递归期间的堆栈使用有关,但是提及它使问题有点难以理解。

我什么时候使用xdata?

我是嵌入式系统编程的新手。 我正在使用一个使用8051芯片组的设备。 我在示例程序中注意到,在定义变量时,有时它们使用关键字xdata。 像这样… static unsigned char xdata PatternSize; 而有时则省略xdata关键字。 我的理解是xdata关键字指示编译器将该变量存储在外部闪存存储器中。 在什么情况下我应该使用xdata在外部存储变量? 访问这些变量需要更长的时间,对吧? 使用xdata存储的值在设备硬重置后不会保留吗? 另外,我理解static关键字意味着变量将在每次调用它所定义的函数时持续存在。是否必须一起使用static和xdata?

常用于RTOS的设计模式(VXworks)

任何人都可以帮我解决RTOS常用的设计模式吗? 在VXworks中,哪种模式更可取?