小编Jer*_*emy的帖子

使用查找表计算(x指数0.19029)低内存?

我正在为PIC微控制器编写一个C程序,它需要做一个非常具体的指数函数.我需要计算以下内容:

A = k.(1 - (p/p0)^ 0.19029)

k和p0是常数,所以除了找到x ^ 0.19029之外,它们都非常简单

(p/p0)比率总是在0-1范围内.

如果我添加math.h并使用power函数,它会很好用,除了耗尽所有可用的16 kB程序存储器.谈论英国媒体报道!(没有电源功能的其余程序= ~20%闪存使用率;添加math.h和电源功能,= 100%).

我希望该程序还可以做其他一些事情.我想知道我是否可以为x ^ 0.19029编写一个特殊的案例实现,可能涉及迭代和某种查找表.

我的想法是为函数x ^ 0.19029生成一个查找表,在0-1范围内可能有10-100个x值.代码将找到一个紧密匹配,然后(不知何故)通过重新缩放查找表值来迭代地改进它.然而,这是我迷失的地方,因为我的小脑无法想象所涉及的数学.

这种方法有用吗?

或者,我已经看过使用Exp(x)和Ln(x),它可以用泰勒展开来实现.b ^ x可以找到:

b ^ x =(e ^(ln b))^ x = e ^(x.ln(b))

(参见:维基百科 - 通过对数的权力)

不过,这看起来有点棘手和复杂.我可能会比编译器的数学库更小的实现,并且我可以根据我的特殊情况简化它(即base = 0-1,exponent始终为0.19029)?

请注意,此刻RAM使用率还可以,但我在Flash上​​运行不足(用于代码存储).速度并不重要.有人已经建议我使用更大的微处理器和更多的闪存,但这听起来像挥霍无度!

[编辑]当我说"(p/p0)比率总是在0-1"范围内时,我很懒.实际上它永远不会达到0,我昨晚做了一些计算并确定实际上0.3到1的范围就足够了!这意味着下面的一些更简单的解决方案应该是合适的.另外,上面的"k"是44330,我希望最终结果中的误差小于0.1.我猜这意味着(p/p0)^ 0.19029中的误差需要小于1/443300或2.256e-6

c math lookup exponent approximation

14
推荐指数
2
解决办法
1376
查看次数

ARM平台上的SIGABRT信号没有回溯?

我在信号处理程序中使用' backtrce() '和' backtrace_symbols_fd() '函数来生成用于调试的回溯(GDB不可用).

它们在x86桌面(Ubuntu)上工作正常,但在目标设备(基于ARM)上,Abort信号的回溯(由于双重自由错误)仅显示三个帧:信号处理程序和两个来自libc,这是没有用的用于调试我们的代码!在SEGV上回溯(例如使用坏指针)产生良好的回溯.

为什么我不能在ARM上获得有用的ABRT信号回溯?

[为清晰起见编辑了问题]

这是一个简单的测试程序,它演示了这个问题:

#include <execinfo.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

// Signal hangler to catch seg fault:
void handler_segv(int sig) {
    // get void*'s for all entries on the stack
    void *array[10];
    size_t size;
    size = backtrace(array, 10);
    fprintf(stderr, "Error: Signal %d; %d frames found:\n", sig, size);
    // print out all the frames to stderr
    backtrace_symbols_fd(array, size, STDERR_FILENO);
    exit(1);
}


void crashme()
{
  // Deliberate Error: Abort (double free): …
Run Code Online (Sandbox Code Playgroud)

c linux arm signals backtrace

11
推荐指数
2
解决办法
4778
查看次数

我是否需要在共享内存对象上使用shm_unlink?

我编写了一个连续运行的服务器(GNU C++/Linux),偶尔执行小型独立程序来完成工作.为了有效地将数据提供给工作程序,服务器创建并映射共享内存对象(为清楚起见,代码缩写):

int fd = shm_open("/shm_file", O_CREAT | O_TRUNC | O_RDWR, S_IRUSR | S_IWUSR);
ftruncate(...);
data = mmap(...);
// etc...
launchWorker(...);   // Start the worker program
Run Code Online (Sandbox Code Playgroud)

然后,worker程序以类似的方式打开这个共享内存(除了只读,没有O_CREAT和O_TRUNC,即我们假设它已经存在).

当worker完成时,它会关闭文件描述符,使用munmap(...)取消映射并使用shm_unlink(...)取消链接.

此时,有一个文件"/ dev/shm/shm_file",我猜是共享内存对象.在工作器中取消链接不会删除它,因为服务器仍然打开它.当服务器取消链接时,文件系统对象消失.此行为与shm_open/shm_unlink的手册页一致,并且适用于我的服务器/工作人员案例.

但是,现在我希望工作人员能够在他们之间共享某些数据,并且可能(用于测试)在服务器未运行时执行此操作.

如果我在一个工作程序中创建一个共享内存对象,并且在退出时不要使用munmap(...)和shm_unlink(...),我注意到共享内存对象保留在/ dev/shm中,我可以打开它又在另一个工人计划中.这很方便.

但是,这样做是否安全?(即重复运行映射共享内存的程序,然后不取消映射/取消链接)?我猜测unmap()并不重要,因为内存映射会随着进程消失,但是shm_unlink呢?鉴于操作系统决定何时根据对象是否仍在使用来删除对象,如果我每次都无法调用shm_unlink(),这会导致某种泄漏吗?

c c++ linux shared-memory

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

如何在 Yocto 中更改 u-boot 的配置

使用 Yocto 项目为 iMX6 开发板构建 linux,我想更改用于构建 u-boot-imx(iMX 开发板的 u-boot)的 .config - 例如将自动启动延迟更改为 1 秒作为例子。

我可以编辑配置(例如找到构建目录并运行 make menuconfig),但是当我运行 bitbake 来重建映像时,它会再次使用默认值覆盖 .config。xxx_defconfig 文件很多,不知道用的是哪个。

我按照本指南使用 Yocto 项目进行内核配置。我对 .config 文件进行了更改,并将其复制到我的图层并重命名为“defconfig”。我用u-boot-imx_2017.03.bbappend创建了一个新层来扩展u-boot-imx_2017.03.bb(u-boot-imx 的配方)。

这是我的u-boot-imx_2017.03.bbappend

FILESEXTRAPATHS_prepend := "${THISDIR}:"

SRC_URI += "file://defconfig"
Run Code Online (Sandbox Code Playgroud)

我还将它添加到 layer.conf 中的“BBFILES”

我重建 u-boot 如下:

bitbake -f -D u-boot-imx -c compile
Run Code Online (Sandbox Code Playgroud)

当我这样做时,构建目录中的 .config 文件将恢复为默认配置(不是我更改的版本),并且生成的 u-boot 二进制文件没有更改(启动延迟仍为 3 秒)。

我认为我的图层正在被处理,因为我在输出中看到了这一点:

DEBUG: Appending .bbappend file /home/bob/yocto/morty/sources/meta-mylayer/imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2017.03.bbappend to /home/bob/yocto/morty/sources/meta-fsl-bsp-release/imx/meta-bsp/recipes-bsp/u-boot/u-boot-imx_2017.03.bb
Run Code Online (Sandbox Code Playgroud)

我看不到任何调试输出说有错误(例如,找不到我的 defconfig 文件)。

如何使用 Yocto 对 u-boot 配置进行这种更改?

===== 编辑 =====

我按照下面 …

linux embedded bitbake yocto

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

多个以太网接口 - 如何创建单独的网络并从C代码访问

我有一个Linux设备(实际上是原型的BeagleBoard),带有两个以太网适配器.我想要的是这个:

  • 主以太网接口(eth0)连接到客户端的网络(可以是DHCP或分配静态IP).

  • 第二个以太网接口(eth1)直接连接到另一个Linux板.

  • Beagle上的用户级C程序可以侦听来自客户端网络的传入连接(在eth0上),根据需要进行响应,并可能连接到eth1上的其他设备

  • 我们希望第二个设备完全隐藏在网络的其余部分,这样只有Beagle上的程序才能连接到它.

我希望这两个接口可以完全分开,我的代码可以选择它想要监听/打开连接的接口.典型代码:

socket_desc = socket(AF_INET, SOCK_STREAM, 0);

memset(&client_addr, 0, sizeof(client_addr)); 
client_addr.sin_family = AF_INET;
inet_pton(  AF_INET, address, (void *)(&(client_addr.sin_addr.s_addr))  );
client_addr.sin_port = htons(port);   

/* Connect to remote on TCP port: */
connect(*socket_desc, (struct sockaddr*) &client_addr, sizeof(client_addr) );
...
Run Code Online (Sandbox Code Playgroud)

我们可以设置要连接的地址和端口,但不能设置以太网接口.我找到了这个答案.这是否意味着我想要实现的内容必须留给内核路由?

我知道我可以将eth1设置为自己的子网,但我有一个问题:鉴于我们对客户端的网络一无所知,我怎么知道我使用的子网不会最终冲突与客户的网络?例如,我在这里使用192.168.1.0,所以我可以将eth1放在192.168.0.0上...但是如果客户端使用该范围怎么办?我们不希望为每个部署重新配置eth1及其连接设备的设置,尽管我们可能必须配置eth0.

那么有更好的方法吗?或者也许是我可以用于eth1子网的保留IP地址范围,保证不与客户端网络冲突(例如169.254.1.x)?

对不起,这有点模糊,但我已经谷歌搜索了好几天,可能会变得更加困惑而不是更少.

编辑 - 2013-08-29:

我刚刚发现这个问题提供了部分答案:您可以使用带有SO_BINDTODEVICE的setsockopt(...)来绑定到特定的设备/接口.这似乎有效,尽管在"内部"网络恰好与连接到eth0的"外部"网络具有相同的IP地址范围的情况下,我仍然无法弄清楚如何设置路由表以便可靠地工作.

c linux tcp interface subnet

5
推荐指数
1
解决办法
2386
查看次数

在Linux设备树中为IO扩展器指定GPIO编号

我正在尝试将PCA9557 I / O扩展器添加到I2C总线上基于手臂的系统上。系统已经在不同的I2C总线上具有另一个I / O扩展器。我试图弄清楚如何指定新扩展器上的针脚获得的GPIO编号,以及如何使它们都能正常工作。

这是I2C总线2下现有扩展器的设备树部分:

        i2c2: i2c@e8007000 {
        status = "ok";

        pca9539: pca9539@74 {
            compatible = "nxp,pca9539";
            reg = <0x74>;
            interrupt-parent = <&gpio>;
            interrupts = <9 0x0>;
            gpio-controller;
            #gpio-cells = <2>;
            interrupt-controller;
            #interrupt-cells = <2>;
        };
        };
Run Code Online (Sandbox Code Playgroud)

使用上述方法,现有的I / O扩展器(带有16个GPIO)在Linux中显示为/ sys / class / gpio / gpiochip128,公开了GPIO编号128-143。GPIO 0-127内置于主机处理器中。

我为I2C总线0上的新扩展器添加了以下内容:

   i2c0: i2c@e8003000 {
        status = "ok";

        pca9557: pca9557@18 {
            compatible = "nxp,pca9557";
            reg = <0x18>;
            gpio-controller;
            #gpio-cells = <2>;
        };
Run Code Online (Sandbox Code Playgroud)

我还修改了内核配置,以构建GPIO_PCA953X驱动程序,该驱动程序应支持PCA9557。

当我将以上内容添加到设备树中进行编译和引导时,我现在看到映射为/ sys / class …

linux i2c gpio device-tree

5
推荐指数
0
解决办法
3946
查看次数