Почему я получаю неопределенную ссылку на _stat в библиотеке sys/stat.h?

Я пытаюсь использовать функцию stat() в библиотеке `#include ‹sys/stat.h›, однако всякий раз, когда я ее вызываю, я получаю эту ошибку:

...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 Спасибо за помощь!

Редактировать: я использую чип STM32 с zephyr RTOS и датчик уровня топлива TI BQ27621.


person PurpleSpark    schedule 21.07.2020    source источник
comment
Возможно, этот ответ может вам помочь: Ответ   -  person David Buzatu    schedule 21.07.2020
comment
@PurpleSpark: Это голый процессор или любой встроенный Linux-процессор? Пожалуйста, укажите, какой конкретный процессор или контроллер TI вы используете.   -  person Gaurav Pathak    schedule 21.07.2020
comment
@GauravPathak Он на процессоре STM32. Я использую Zephyr RTOS. Я тоже обновлю свой вопрос этим   -  person PurpleSpark    schedule 21.07.2020
comment
@PurpleSpark: код на странице 17 предназначен для приложения пользовательского пространства Linux, а не для чистого встроенного программного обеспечения.   -  person Gaurav Pathak    schedule 21.07.2020
comment
Вы должны показать, как вы построили свой код (команды и параметры компиляции/связывания).   -  person lurker    schedule 21.07.2020
comment
Итак, нет, на вашей платформе нет stat, среда вашей платформы не реализует ни posix, ни другие стандарты операционной системы, нет базовой файловой системы, и это просто не имеет смысла. Zeprhy может быть настроен для поддержки значимого подмножества функций posix, но для ввода-вывода вы должны реализовать их самостоятельно. Где вы ожидаете, что файл "battery.gm.fs" будет расположен? Во вспышке? В рам? На внешней сд карте?   -  person KamilCuk    schedule 21.07.2020
comment
@KamilCuk Извините, я новичок в этом пространстве - не могли бы вы объяснить мне, как вы узнали, что моя платформа его не поддерживает? И я хочу, чтобы battery.gm.fs располагался в оперативной памяти.   -  person PurpleSpark    schedule 21.07.2020
comment
And I want Так реализуйте это. how you found out that my platform doesn't support it? Ну... проще объяснить, где что-то есть, чем чего-то не хватает отовсюду. Поскольку вы получаете неопределенную ссылку, символ отсутствует. Но, возможно, это знакомство с zephyr, newlib, разработкой встроенных и «голых» приложений и автономной средой.   -  person KamilCuk    schedule 21.07.2020
comment
Если вы намерены внедрить примитивы ввода-вывода POSIX на вашем автономная среда (или не такая автономная, как вы включаете зефир) я рекомендуем ознакомиться с как портировать newlib так как скорее всего вы закончите используя newlib как реализацию стандартной библиотеки C (я думаю, zephyr может использовать свою собственную )   -  person KamilCuk    schedule 21.07.2020
comment
STM32 — это очень обширная линейка микроконтроллеров. Можете быть более конкретными? И есть ли в вашей системе дополнительные компоненты, такие как внешняя флэш-память, внешняя оперативная память, SD-карта и т. д., подключенные к MCU?   -  person Codo    schedule 21.07.2020
comment
@Codo, что это изменит? STM32, кроме M2, который является прикладным процессором + uC, не реализует его.   -  person 0___________    schedule 21.07.2020
comment
@Codo Я использую микроконтроллер stm32g0316. Нет, у меня не будет дополнительных периферийных устройств   -  person PurpleSpark    schedule 21.07.2020
comment
@P__J__ Просто убедился, что это не необычная установка. Я согласен: ни подсистемы ввода-вывода, ни файловой системы, ни функций POSIX, ни _stat(). @PurpleSpark Скопированный вами исходный код был написан для совершенно другой лиги систем: система Linux с файловой системой и приличным объемом оперативной памяти против MCU STM32 с суперминимальной операционной системой, очень ограниченной оперативной памятью и без файловой системы.   -  person Codo    schedule 22.07.2020
comment
@PurpleSpark Вы можете забыть почти все, что вы узнали о программировании в Linux. 3/4 включаемых файлов из вашего кода придется удалить. Забудьте о файловых системах (если вы их не реализуете), забудьте о динамическом распределении памяти и многих других функциях. Наборы инструментов uC обычно реализуют только минимальный набор функций. Некоторые могут присутствовать только как заглушки.   -  person 0___________    schedule 22.07.2020
comment
@Codo значит ли это, что fopen() из #include<stdio.h> тоже не будет работать? Я пытаюсь читать файлы, используя это, и это дает мне errno как 0, но я не уверен, как это интерпретировать, потому что 0 является значением по умолчанию.   -  person PurpleSpark    schedule 22.07.2020
comment
@P__J__ Это из таблицы данных моей платы: It also includes optional interfaces for middleware components comprising a TCP/IP stack and a Flash file system. Разве это не означает, что у нее есть файловая система?   -  person PurpleSpark    schedule 22.07.2020
comment
Я не очень хорошо знаком с Zephyr OS. Он может включать часть stdio для поддержки форматирования строк (sprintf) и т. д. Но на вашем устройстве нет ни файловой системы, ни файлов. Так что fopen() не имеет смысла.   -  person Codo    schedule 22.07.2020
comment
@PurpleSpark fopen не будет работать. например, toy может добавить поддержку fatfs (от chan) или lwip.   -  person 0___________    schedule 22.07.2020


Ответы (1)


Пример кода, который вы пытаетесь перенести на свое устройство, был написан для системы Linux (например, для Raspberry Pi). Такая система гораздо более функциональна, чем ваша плата MCU: она имеет полнофункциональную операционную систему, файловую систему и файлы, а также необходимые операции ввода-вывода. Вы по-прежнему можете запустить соответствующие части на своей плате с помощью ОС Zephyr:

API, зависящие от конечной системы

Реализация функций gauge_read, gauge_write и gauge_address требуется и описана в документе TI. Это должно быть довольно просто, так как это в основном оболочка для связи I2C. Zephyr предоставляет необходимые функции I2C.

Теперь файлы gauge.c и gauge.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() и т. д.) больше не нужен и может быть удален. Теперь ваша программа должна скомпилироваться и собраться.

person Codo    schedule 22.07.2020
comment
Спасибо @Кодо. Я отказался от использования stat()1 и fopen() и просто поместил все в #define в своей программе. Я думаю, что это самый простой способ уйти отсюда. - person PurpleSpark; 22.07.2020