【问题标题】:Why am I getting "undefined reference to `_stat`" in the sys/stat.h library? [duplicate]为什么我在 sys/stat.h 库中得到“未定义的对 `_stat` 的引用”? [复制]
【发布时间】:2020-11-11 06:40:32
【问题描述】:

我正在尝试使用 `#include 库中的 stat() 函数,但是每当我调用它时都会收到此错误:

...toolchains/gcc-arm-none-eabi-8-2018/arm-gcc-macos/arm-none-eabi/lib/thumb/v6-m/nofp/libc_nano.a(lib_a-statr.o): in function `_stat_r':
statr.c:(.text._stat_r+0xe): undefined reference to `_stat'

这是我的文件(我已经列出了所有包含的内容,我知道有些可能与此问题无关,但我已经列出了所有内容):

#include <kernel.h>
#include <device.h>
#include <drivers/i2c.h>
#include <sys/__assert.h>
#include <logging/log.h>
#include <sys/printk.h>
#include <soc.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>

#define SOURCE_FILE   "battery.gm.fs"

int write_to_dev(struct device* dev)
{
    struct stat st;
    int nSourceFile;
    char *pFileBuffer;

    stat(SOURCE_FILE, &st); // problematic line
    // other code here
}

每当我打电话给write_to_dev() 时,我都会遇到这个问题。我的代码基于此链接的第 17 页:https://www.ti.com/lit/an/slua801/slua801.pdf?ts=1595360845070&ref_url=https%253A%252F%252Fwww.google.com%252F 感谢您的帮助!

编辑:我正在使用带有 zephyr RTOS 和 TI BQ27621 电量计的 STM32 芯片

【问题讨论】:

  • 也许这个答案可以帮助你:Answer
  • @PurpleSpark:它是裸机还是任何嵌入式 Linux 处理器?请指定您使用的是哪个特定的 TI 处理器或控制器。
  • @GauravPathak 它在 STM32 处理器上。我正在使用 Zephyr RTOS。我也会用这个更新我的问题
  • @PurpleSpark:第 17 页上的代码适用于 Linux 用户空间应用程序,不适用于裸机纯固件。
  • 所以,不,您的平台上没有 stat,您的平台环境没有实现 posix 或其他操作系统标准,没有底层文件系统,这毫无意义。 Zeprhy can be configured 支持有意义的 posix 函数子集,但对于 I/O,您必须自己实现它们。您希望文件"battery.gm.fs" 位于何处?闪现?在内存中?在外部 SD 卡中?

标签: c embedded firmware texas-instruments


【解决方案1】:

您尝试移植到设备的示例代码是为 Linux 系统(例如,Raspberry Pi)编写的。这样的系统比您的 MCU 板功能强大得多:它具有成熟的操作系统、文件系统和文件以及必要的 I/O 操作。您仍然可以使用 Zephyr OS 让相关部件在您的板上运行:

依赖于终端系统的 API

实现函数 gauge_readgauge_writegauge_address 是 TI 文档所要求和描述的。它应该相当简单,因为它主要是 I2C 通信的包装器。 Zephyr 提供了所需的 I2C 功能。

现在文件gauge.cgauge.h 应该可以编译了。

FlashStream 初始化

示例代码使用文件系统操作来检索文件(FlashStream 格式)来初始化传感器。文件格式的解析器是gauge.c 的一部分,并将字符串(文本文件内容)作为输入。所以它不依赖于文件系统操作。

我从未使用过这样的传感器,但我猜初始化文件很短,可以很容易地嵌入为字符串。因此,创建初始化文件,将其作为文本文件打开并将内容复制到您的程序中:

const char* fs =
    "W: AA 3E 02 00\n"
    "C: AA 3E 02 00 02 20 00 03\n"
    "W: AA 3E 02 00\n";

现在您可以初始化传感器了:

gauge_execute_fs(pHandle, fs);

不再需要文件系统代码(stat()fopen() 等),可以将其删除。您的程序现在应该可以编译和构建了。

【讨论】:

  • 谢谢@Codo。我放弃了使用stat()1fopen() 并将所有内容都放在我的程序中的#define 中。我认为这是从这里出发最简单的方法。
猜你喜欢
  • 2013-08-19
  • 2014-04-06
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2015-03-23
  • 2012-02-05
  • 2021-09-18
相关资源
最近更新 更多