• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

выравнивание памяти ;-)

Сергей_Ф

Moderator
Команда форума
@doleynikov в строке 186 basic.cpp также исправить на
Код:
  host_outputString(tokenTable[*p].token);
осталось найти где Вы неправильно пишете в память и всё :)
 

doleynikov

New member
Я вернул всю работу с PROGMEM. не в ней дело вроде. пробую искать , где неправильно пишу в память ;-)
 

Сергей_Ф

Moderator
Команда форума
мне вот не нравится работа со стеком в basic.cpp
Вы поменяли uint16_t на uint32_t, но коррекция указателей везде осталась на 2
я попробовал поменять на 4, но результата это не принесло. Надо внимательно смотреть
 

doleynikov

New member
Надо внимательно смотреть
Сергей, я отменил все старые исправления, поменял int на 16 битный инт. если интересно с этим разбираться - скачайте изменения проекта. Я отказался от 32 битных целых - не нужно это. Но все равно ошибка там же.
 

Юрий Ботов

Moderator
Команда форума
Ok. Пройдемся по nextToken. На примере "a = 100 \0"
Для начала:

static unsigned char *tokenIn, *tokenOut;
четырех битные указатели на массив проинициализированные нулем.

в процедуре tokenize их до вызова nextToken инициализируют реальными ссылками на массивы
tokenIn = input;
tokenOut = output;

Выходной массив адресуется побайтово, но реально представляет собой массив 32 битных слов. Он пока пуст.
Первый вызов nextToken: сначала отбрасываем ненужные пробелы, проверяем не конец ли это строки(это каждый раз дальше писать это не буду) находим "a",считаем его идентификатором, копируем его как 1 байт + байт 0x80 в output. в output - 2 байта.
Второй вызов nextToken: находим '=' ищем в tokenTable - находим, считаем его операцией и записываем его (1 байт) в output. в output - 3 байта.
Третий проход: находим 100, считаем его цифрой, преобразуем в long (поскольку нет '.'). записываем long(4 байта) в output. ... облом. При попытке записи вылетает ошибка "запись в невыравненную пеамять". Оно не может записать 4 байта long так чтобы 1 байт был в предыдущем слове, а остальные три - в следующем.
До 0-символа дело так и не доходит
 

doleynikov

New member
То есть, получается, проблема в том, что AVR 8 битный и его слово в памяти = байту, а 32 битный. и не может писать лонг в последовательные байты, если пересекается граница 32 битного слова? то есть, если заменить
Код:
  *(long*)tokenOut = (long)val;
на побайтовую запись в то же самое место, то все прокатит?
 

Юрий Ботов

Moderator
Команда форума
Запись и чтение тоже побайтовые. Причем вручную, не используя memcpy и strcpy. Должно прокатить.
 

Сергей_Ф

Moderator
Команда форума
@doleynikov что бы не изобретать велосипед, посмотрите реализацию memcpy и strcpy и сделайте по образу и подобию.
 

Сергей_Ф

Moderator
Команда форума
@doleynikov если когда получится - выкладывайте. Интересно попробовать. Я бы ещё эмулятор Спектрума на нем запилил с экраном 320*240, но ни времени ни знаний для этого нет :(. Там уже машинные коды придется эмулировать для игр.
 
Последнее редактирование:

nikolz

Well-known member
А еще можно машину тьюринга сварганить.
Жаль схемы нет.
 

Юрий Ботов

Moderator
Команда форума
Ностальгия - всегда хорошая тема для бизнеса. Бедные не ностальгируют, им не до этого. Значит целевая аудитория по определению платежеспособна :)
 

pvvx

Активный участник сообщества
Сверху Снизу