• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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

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