Tag: 嵌入式

在C中转换为ASCII

使用微控制器(PIC18F4580),我需要收集数据并将其发送到SD卡以供以后分析。 它收集的数据的值介于0和1023之间,或者0x0和0x3FF之间。 所以我需要做的是将1023转换为基本的10个字符串ASCII值(0x31,0x30,0x32,0x33,…)。 我的问题是,我能想到的将数字分开的唯一方法需要进行大量的划分。 char temp[4]; temp[0] = 1023 % 10; temp[1] = (1023 % 100) / 10; temp[2] = (1023 % 1000) / 100; temp[3] = (1023 % 10000) / 1000; 使用此方法,查找n位十进制数的ASCII值需要2n-1个除法。 有没有更快的方法? 最终目标是结束SD卡上的.csv文件,该文件可以快速插入任何笔记本电脑,以查看Excel中的数据图表。

计算没有std函数或C99的atan2

我正在计算3轴加速度计的角度,但我的编译器没有atan或atan2function。 它有一个保留的内存插槽,但它调用了一个我在任何文件中都找不到的function。 我的编译器是运行ARMCC编译器的KeilμVision4。 编译有文件math.h,但函数是extern并且不存在: extern _ARMABI double atan2(double /*y*/, double /*x*/); 是否有我可以包含的lib或函数,它具有arctan函数的实现? 或者是否有另一种function来计算加速度计的角度? 我需要完整的3轴角度校准。 编辑:我希望避免一个充满预先计算值的表格。

嵌入式系统上的三角函数

sin和cos函数很慢,需要大量资源才能在嵌入式系统上运行。 如何以更节省资源和更快速的方式计算sin和cos函数?

嵌入式C项目是否有一个很好的小型XML解析器?

我正在为一个嵌入式项目提供一个非常小的XML解析器。 它需要编译为10-15k,不需要validation,并且需要简单和便携。

按位转置8个字节

我在C中寻找一种有效的算法来按位转换8字节的数据。 我的意思是,如果我有8个这样的字节: 00011100 00111000 00000001 00000000 11000000 00000000 11111111 01010101 我想获得以下8个字节: 00001010 00001011 01000010 11000011 11000010 10000011 00000010 00100011 而且由于我想在嵌入式平台上使用它,它应该尽可能快:-) 所有的想法都非常感谢!

如何强制在C中强制使用未被优化的未使用内存?

微控制器通常需要读取寄存器以清除某些状态条件。 在C中是否有可移植的方式来确保如果不使用数据则不会优化读取? 指向内存映射寄存器的指针是否足以声明为volatile? 换句话说,以下是否始终适用于标准兼容编译器? void func(void) { volatile unsigned int *REGISTER = (volatile unsigned int *) 0x12345678; *REGISTER; } 我知道处理这样的function会遇到编译器相关的问题。 所以,在这种情况下,我对便携式设备的定义有点松散。 我只是说它会尽可能广泛地使用最流行的工具链。

通过访问function访问共享内存需要`volatile`吗?

[ 编辑 ]对于背景阅读,并且要清楚,这就是我所说的: volatile关键字简介 在查看嵌入式系统代码时,我看到的最常见错误之一是省略了线程/中断共享数据的volatile。 但是我的问题是,当通过访问函数或成员函数访问变量时,是否“安全”不使用volatile ? 一个简单的例子; 在以下代码中…… volatile bool flag = false ; void ThreadA() { … while (!flag) { // Wait } … } interrupt void InterruptB() { flag = true ; } …变量flag必须是易失性的,以确保ThreadA中的读取未被优化,但是如果通过函数读取标志… volatile bool flag = false ; bool ReadFlag() { return flag } void ThreadA() { … while ( […]

在PIC18上使用C的multithreading

在编写PIC18时 ,如何创建并行运行的线程,因为没有操作系统?

嵌入式应用程序中的内存管理资源

我应该如何管理关键任务嵌入式应用程序中的内存? 我在谷歌发现了一些文章,但无法确定一个非常有用的实用指南。 DO-178b禁止动态内存分配,但是如何管理内存呢? 提前预先分配所有内容并发送指向需要分配的每个function的指针? 在堆栈上分配它? 使用全局静态分配器(但它与动态分配非常相似)? 例如,答案可以是常规答案,对资源的引用或对良好的开源嵌入式系统的引用。 澄清:这里的问题不在于内存管理是否适用于嵌入式系统。 但是什么是嵌入式系统的优秀设计,以最大限度地提高可靠性。 我不明白为什么静态预分配缓冲池,并动态地获取和删除它,与动态分配内存不同。

lwIP是否支持Zeroconf?

我看到lwIP有一些AutoIP(又名IPv4LL,又名RFC 3927 )代码,但我不知道它是否在Zeroconf堆栈中做了更高的任务,即mDNS和DNS-SD (使用RFC 2782 )。 那么,lwIP是否支持DNS-SD服务发现? 如果没有,是否容易从像Avahi这样的项目中移植代码(假设许可允许)?