Tag: 嵌入式

@登录C变量声明

我找到了PIC微控制器的这个头文件,名称为pic1250.h,我无法理解其中使用的一些语法。 该文件的来源是: /* * Header file for the Microchip * PIC 12c508 chip * PIC 12c509 chip * Baseline Microcontrollers */ static volatile unsigned char RTCC @ 0x01; static volatile unsigned char TMR0 @ 0x01; static volatile unsigned char PCL @ 0x02; static volatile unsigned char STATUS @ 0x03; static unsigned char FSR @ 0x04; […]

从最接近目标值的数组中选择值的算法?

我有一个几乎排序的值数组28个元素长。 我需要找到与算法提供的目标值相加的一组值(或者如果找不到精确的和,则最接近的总和低于目标值)。 我目前有一个简单的算法来完成这项工作,但它并不总能找到最佳匹配。 它在理想情况下使用一组特定的值工作,但我需要一个更强大和准确的解决方案,可以处理更多种类的数据集。 该算法必须用C语言编写,而不是用C ++编写,并且用于嵌入式系统,因此请记住这一点。 这是我目前的算法供参考。 它从可用的最高值开始迭代。 如果当前值小于目标总和,则将该值添加到输出并从目标总和中减去该值。 重复此过程,直到达到总和或用完值。 它假设一个几乎提升的排序列表。 //valuesOut will hold a bitmask of the values to be used (LSB representing array index 0, next bit index 1, etc) void pickValues(long setTo, long* valuesOut) { signed char i = 27;//last index in array long mask = 0x00000001; (*valuesOut) = 0x00000000; mask = […]

修复了C中的地址变量

对于嵌入式应用,通常需要访问外设寄存器的固定存储器位置。 我发现这样做的标准方法如下: // access register ‘foo_reg’, which is located at address 0x100 #define foo_reg *(int *)0x100 foo_reg = 1; // write to foo_reg int x = foo_reg; // read from foo_reg 我理解它是如何工作的,但是我不明白的是foo_reg的空间是如何分配的(即什么使链接器不能将另一个变量放在0x100?)。 可以在C级别保留空间,还是必须有一个链接器选项,指定不应将任何内容放在0x100。 我正在使用GNU工具(gcc,ld等),所以我最感兴趣的是该工具集的具体细节。 有关我的架构的一些其他信息,以澄清问题: 我的处理器通过一组映射到FPGA的接口,这些寄存器映射到处理器的常规数据空间(其中存在变量)。 所以我需要指向那些寄存器并阻止相关的地址空间。 在过去,我使用了一个编译器,它具有从C代码中定位变量的扩展。 我会将寄存器分组到一个结构中,然后将结构放在适当的位置: typedef struct { BYTE reg1; BYTE reg2; … } Registers; Registers regs _at_ 0x100; regs.reg1 = […]

为什么全局变量在单线程,非os,嵌入式应用程序中是坏的

我看到使用全局变量的大多数异议都有意义,因为它们涉及multithreading,线程安全等问题。 但是在一个小的,单线程的,非操作系统的情况下,你有什么异议? 就我而言,如果重要的话,我正在用“C”编写我的嵌入式系统。 我也是该产品的唯一开发人员。 为什么消除全局变量会使我的代码更好? (在阅读了几个响应之后,我意识到我也应该指出这个系统没有动态内存分配(例如malloc)。所有内存都是在编译时静态分配的。)

一行中的多个赋值

我刚刚看到嵌入式c语句(dsPIC33) sample1 = sample2 = 0; 这意味着什么 sample1 = 0; sample2 = 0; 他们为什么这样输入? 这是好还是坏编码?

将ASM转换为C(不是逆向工程)

我用谷歌搜索,我看到一个惊人的轻浮反应基本上嘲笑提问者问这样一个问题。 Microchip免费提供一些源代码(我不想在这里发布,以防万一。基本上,谷歌AN937,点击第一个链接,有一个链接“源代码”及其压缩文件)。 它在ASM中,当我看到它时,我开始睁大眼睛。 我想把它转换成类似ac类型语言的东西,这样我就可以跟随它。 因为行如: GLOBAL _24_bit_sub movf BARGB2,w subwf AARGB2,f 可能很简单,但它们对我毫无意义。 必须有一些自动ASM到C的翻译器,但我能找到的只是人们说它不可能。 坦率地说,它不可能是不可能的。 两种语言都有结构,这种结构肯定可以翻译。 谢谢。