小编Gre*_*unn的帖子

修复了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
Run Code Online (Sandbox Code Playgroud)

我理解它是如何工作的,但我不明白的是foo_reg的空间是如何分配的(即什么使链接器不能将另一个变量放在0x100?).可以在C级别保留空间,还是必须有一个链接器选项,指定不应将任何内容放在0x100.我正在使用GNU工具(gcc,ld等),所以我最感兴趣的是该工具集的具体细节.

有关我的架构的一些其他信息,以澄清问题:

我的处理器通过一组寄存器连接到FPGA,这些寄存器映射到处理器的常规数据空间(其中存在变量).所以我需要指向那些寄存器并阻止相关的地址空间.在过去,我使用了一个编译器,它有一个扩展用于从C代码中定位变量.我会将寄存器分组到一个结构中,然后将结构放在适当的位置:

typedef struct
{ 
   BYTE reg1;
   BYTE reg2;
   ...
} Registers;

Registers regs _at_ 0x100;

regs.reg1 = 0;
Run Code Online (Sandbox Code Playgroud)

实际上创建一个'Registers'结构保留了编译器/链接器眼中的空间.

现在,使用GNU工具,我显然没有扩展.使用指针方法:

#define reg1 *(BYTE*)0x100;
#define reg2 *(BYTE*)0x101;
reg1 = 0

// or
#define regs *(Registers*)0x100
regs->reg1 = 0;
Run Code Online (Sandbox Code Playgroud)

这是一个没有操作系统且没有高级内存管理的简单应用程序.实质上:

void main()
{
    while(1){
        do_stuff();
    }
}
Run Code Online (Sandbox Code Playgroud)

c embedded

15
推荐指数
3
解决办法
3万
查看次数

gnuplot可以计算并绘制连续数据点之间的增量

例如,给定以下数据文件(此示例为x ^ 2):

0
1
4
9
16
25
Run Code Online (Sandbox Code Playgroud)

gnuplot可以绘制点以及点之间的差异,就好像它是:

0 0
1 1   # ( 1 - 0 = 1)
4 3   # ( 4 - 1 = 3)
9 5   # ( 9 - 4 = 5)
16 7  # (16 - 9 = 7)
25 9  # (25 -16 = 9)
Run Code Online (Sandbox Code Playgroud)

实际文件不仅仅包含我感兴趣的列,如果可能的话,我想避免预处理以添加增量.

gnuplot

7
推荐指数
3
解决办法
1万
查看次数

标签 统计

c ×1

embedded ×1

gnuplot ×1