Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
28.04.2017, 13:14
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,058
Сказал спасибо: 2,563
Сказали Спасибо 11,890 раз(а) в 5,964 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
Сообщение от mike-y-k
|
Задача, поставленная ТС, сильно зависит от контекста и ресурсов проекта. Отсюда избыточная многовариантность обсуждени. При более точных данных можно было и предметно разобрать и взвесить проект, подобрать оптимальную систему обработки,… пока только поток вариантов, без возможности оценки их применимости/оптимальности/…
|
А если так?
Сообщение от MisterDi
|
Процессор НИОС-2 операционной систем нет, в файл пишется содержимое регистров периферийных устройств. Данные пишутся на SD-карту. Собственно это привинчивание внешней памяти к моему DSO
|
Но тут
Сообщение от MisterDi
|
порядок следования - произвольный
|
он, видимо, несколько погорячился, излишне усложнив задачу.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
29.04.2017, 00:11
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
Для NIOS II как раз оптимальнее не развлекаться с лишним текстовым геморроем, а сделать нужное именно на ПК.
Речь в данном случае идёт больше наверное о пресетах для DSO и громоздить их обработку может стать себе дороже. В свободную память лучше анализаторы протоколов и FFT поместить .
А для настройки/корректировки/клонирования создать простенькую программу для ПК.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
29.04.2017, 11:04
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
Попробуйте так, как делаю я:
Нажмите, чтобы открыть спойлер
Код:
|
#define INI_STR_TYPE_UNKNOWN 0x00
#define INI_STR_TYPE_COMMENT 0x01
#define INI_STR_TYPE_SECTION 0x02
#define INI_STR_TYPE_CONF_LINE 0x03
#define INI_STR_TYPE_ERROR 0x04
#define INI_STR_TYPE_EMPTY 0x05
void StrToTokens(char *text, uint8_t StrLen, uint8_t *tokens, uint8_t *tokensCount, uint8_t *strtype) {
uint8_t i, j;
j = 0;
i = 0;
*strtype = INI_STR_TYPE_UNKNOWN;
*tokensCount = 0;
if (StrLen ‹= 1) {
// Слишком короткая строка - Скорее всего, она пустая.
*strtype = INI_STR_TYPE_EMPTY;
return;
};
// Поиск символа отличного от пробела
while ((text[i] ‹= ' ') && (i‹=StrLen)) { i++; };
// Комментарий. Обработка не нужна.
if ((text[i] == ';') || (text[i] == '#')) { *strtype = INI_STR_TYPE_COMMENT; return; };
// Секция.
if (text[i] == '[') { *strtype = INI_STR_TYPE_SECTION; i++; };
tokens[0] = i;
if (*strtype == INI_STR_TYPE_SECTION) {
while((text[i] != ']') && (i‹StrLen)) { i++; };
if (i›=StrLen) {
// Ошибка! Уехали за конец строки, а окончание названия секции так и не нашли. =(
*strtype = INI_STR_TYPE_ERROR;
return;
} else {
// Проверка на пустую секцию - []
if (i == tokens[0]) {
*strtype = INI_STR_TYPE_ERROR;
return;
};
text[i] = 0; // Конец токена.
};
} else {
// Если добрались до сюда - вероятно, это линия с конфигурацией.
*strtype = INI_STR_TYPE_CONF_LINE;
// Теперь самое интересное.
j = 0;
i = tokens[j];
// Ищем что-то из символов [ ;:=#] или конец строки
while (i ‹ StrLen) {
if (j ‹ 4) {
tokens[j] = i;
while ((text[i] != ' ') && (text[i] != '=') && (text[i] != ':') && (text[i] != ';') && (text[i] != '#') && (i ‹ StrLen)) {
i++;
};
// Если пробелы и/или равно - пропускаем. Этим я, конечно, сильно отступаю от правил работы с INI, но не столь фатально для себя.
// В моём случае любая запись из нижеприведёных будет действовать:
// Field = Value
// Field=Value
// Field:Value
// Field Value ‹-- Даже эта! Но всем пофиг! (с)
while ((text[i] == ' ') || (text[i] == '=') || (text[i] == ':')) {
text[i] = 0;
i++;
};
if ((text[i] == ';') || (text[i] == '#')) {
// Дальше комментарии.
*tokensCount = j+1;
return;
};
j++;
} else {
break;
};
};
*tokensCount = j;
};
};
(Внутри другой процедуры, открывшей конфигурационный файл)
wr_pos = 0;
while (fp.fsize › fp.fptr) {
result = f_read(&fp, &s, 1, &ReadBytes);
if (ReadBytes) {
EOL = 0;
if (s == '\r') {
EOL = 1;
};
if (s == '\n') {
EOL = 1;
};
if (!(EOL)) {
txt_string[wr_pos] = s;
wr_pos++;
} else {
txt_string[wr_pos] = 0;
StrToUpper(txt_string);
StrToTokens(txt_string, wr_pos, (uint8_t*)&(Tokens[0]), &nTokens, &StrType);
if (!(strcmp("ADDRESS", (char*)&(txt_string[Tokens[0]])))) {
SYS_IP = StrToIP((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("NETMASK", (char*)&(txt_string[Tokens[0]])))) {
SYS_NET_MASK = StrToIP((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("GATEWAY", (char*)&(txt_string[Tokens[0]])))) {
SYS_GW = StrToIP((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("HWADDRESS", (char*)&(txt_string[Tokens[0]])))) {
SetMac((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("SERVERIP", (char*)&(txt_string[Tokens[0]])))) {
SYS_SERVER_IP = StrToIP((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("SERVERPORT", (char*)&(txt_string[Tokens[0]])))) {
SYS_SERVER_PORT = StrToInt((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("NTPSERVER", (char*)&(txt_string[Tokens[0]])))) {
SYS_NTP_SERVER = StrToIP((char*)&(txt_string[Tokens[1]]));
};
if (!(strcmp("TIMEZONE", (char*)&(txt_string[Tokens[0]])))) {
i = 0;
m = 1;
v = 0;
while ((s = txt_string[Tokens[1]+i])) {
if ((s ›= '0') && (s ‹= '9')) {
v = v*10 + (s - '0');
} else {
if (s == '-') {
m = -1;
};
};
i++;
};
v = v * m;
SYS_TIME_ZONE = v;
};
wr_pos = 0;
};
};
}; |
Суть сего кода:
Открывается файл конфигурации, читается по байту (встроенное чтение файла читает не всегда корректно), находится конец строки (можно регулировать в коде), преобразовывается в верхний регистр, разбивается на токены, производится сравнение, затем полученый от функции ответ анализируется и преобразовывается из токенов в пары "Параметр" / "Значение". А последний уже анализируется и пишется куда нужно.
Функции преобразования - самописные.
|
|
|
Эти 3 пользователя(ей) сказали Спасибо -Alan- за это сообщение:
|
|
|
29.04.2017, 18:46
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,257
Сказал спасибо: 11,170
Сказали Спасибо 3,858 раз(а) в 2,928 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
Собственно по .h со структурой того пресета разбор с выводом на лету и редактированием пишется на том же perl и никаких проблем. Текстовый файл даже не нужен. Самое удобное (не страдать с выводом на экран) - cgi скрипт. Но есть и оконные библиотеки.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
02.05.2017, 21:41
|
|
Вид на жительство
Регистрация: 10.06.2007
Сообщений: 429
Сказал спасибо: 34
Сказали Спасибо 51 раз(а) в 47 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
-Alan-, вот в этой строчке:
PHP код:
|
while((text[i] != ']') && (i=StrLen) {
|
форум съел вот это:
PHP код:
|
‹StrLen)) { i++; };
if (i›
|
Из-за знаков "меньше" и "больше". Чудятся ему злобные XSS что-ли... и даже тег [код] не помог. Видимо, надёжнее всего прикреплять файл *.c или *.txt
Ну и небольшой вопрос заодно - зачем тут:
Код:
|
strcmp("ADDRESS", (char*)&(txt_string[Tokens[0]])) |
нужно приведение типа указателя txt_string к типу char? Разве txt_string и так не char?
|
|
|
|
05.05.2017, 14:23
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Сохранение и загрузка настроек в текством файле
Действительно.
Прикрепил файл с нарезкой кода.
code.txt
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:15.
|
|