Easyelectronics.ru

Электроника для всех
Текущее время: 26 ноя 2020, 20:10

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 23 июл 2020, 14:36 
Здравствуйте!

Зарегистрирован: 23 июл 2020, 14:07
Сообщения: 3
Добрый день, подскажите плиз куда копать... С какого-то момента (вырос код проекта), при добавлении нового функционала проекта, Микропаскаль генерирует не рабочий код. Выглядит это странно... Есть процедура меню которая нормально отрабатывала на версии v1. Эта процедура просто выводит на дисплей строки из константного массива строк. Далее при добавлении нового каркаса подпрограммы
Код:
procedure NewProc; begin end;
, в другом модуле проекта, перестает корректно работать процедура меню...Это выглядит как вывод пустых строк, либо части конкантенированных строк
Код:
var S: string[14]; begin lcd_out(1, 1, '**' + s); end; //выводит только звездочки
, либо вообще в отладчике протеуса выскакивает ошибка out of memory.
На каком то этапе мне удалось пофиксить проблему и добавить новый функционал, переписав код процедуры меню, эквивалентно написанному ранее...Но сейчас опять возникла потребность в добавлении нового функционала, и происходит то же самое - при добавлении нового кода/функционала, причём пока каркаса процедуры, перестаёт работать ранее отлаженный рабочий код.
Может кто подскажет, куда копать и как с этим бороться?...Получается абсолютно непригодный к сопровождению проект...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 23 июл 2020, 14:49 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2843
Откуда: Санкт-Петербург
Будь дело на десктопе, я бы предположил, что где-то порча памяти. Микропаскаль позволяет откомпилировать со всеми проверками – выход за границы массива, переполнение стека и т.п.?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 23 июл 2020, 14:57 
Здравствуйте!

Зарегистрирован: 23 июл 2020, 14:07
Сообщения: 3
aamonster писал(а):
Будь дело на десктопе, я бы предположил, что где-то порча памяти. Микропаскаль позволяет откомпилировать со всеми проверками – выход за границы массива, переполнение стека и т.п.?

К сожалению не позволяет... Вообщем не знаю что делать. Проект почти написан и такой облом. Разматывать ассемблер, нет никакого желания. Проще переписать всё на си.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 23 июл 2020, 16:59 
Старожил

Зарегистрирован: 27 апр 2013, 13:53
Сообщения: 1443
Если имеете возможность, то отошлите баг-репорт производителю данного инструментария.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 24 июл 2020, 18:07 
Здравствуйте!

Зарегистрирован: 23 июл 2020, 14:07
Сообщения: 3
Вобщем кому интересно, изложу свои изыскания по поводу решения проблемы...Решил я всё таки размотать ассемблер и увидел следующее. При сборке микропаскаль не всегда правильно размещает код в адресном пространстве флэша. Возможно это связано с конкретной копией компилятора (может не лицензионной). При отладке удалось выяснить следующее: листинг ассемблерного файла, а именно часть адресного пространства, не соответствует части адресного пространства прошивки...В моём случае в листинге ассемблерного файла
был следующий вызов:
Код:
LDI        R18, lo_addr(_c1+0)
LDI        R19, hi_addr(_c1+0)

ксонстанта _c1+0 находилась по адресу 0x4B85, а в отладчике я увидел совсем другой адрес 0x16BA (адрес инструкции из тела другой подпрограммы).
Вобщем решил я откатиться на рабочую версию, и сохранил листинг ассемблерного файла программы, затем добавил новый функционал, собрал и начал сравнивать листинги.
Увидел что, все подпрограммы библиотек и моего проекта из рабочей версии, размещаются по конкретным адресам...Последняя подпрограмма размещается по адресу 0x232D,
размер её 19 байт...Предположил, что если попробовать разместить код нового функционала по адресу последней подпрограммы из рабочей версии + её размер, другими словами разместить последней. Для этого использовал квалификатор
Код:
org 0x2340;
и к моему удивлению всё заработало...
Из всего вышесказанного делаю вывод следующий:
Микропаскаль от mikroe - инструмент сырой очень много не доработок. Для серьёзных проектов лучше использовать другой инструмент.
Похоже у оптимизатора свое мнение по поводу компиляции проекта. Volatile только давит hint-ы, но не способствует изменению поведения компилятора (или возможно мне так показалось). При добавленных ключевых словах Volatile в нужных местах и отключенной на проч оптимизацией (уровень оптимизации Zero), hint-ы исчезли, а вот билд оказался кривой
и перестал работать.
Работа со строками очень опасна и трудна...Один и тот же код может по разному работать или не работать в подпрограммах. Про конкантенацию в стиле Delphi
Код:
var S1, S2, S3: string[8];
begin
  S3 := '';
  S1 := S1 + S2;
  MyProc('K' + S1 + ':' + S3);
end;

следует забыть. Работает она только в простых случаях, как указано в helpe. Но если нужна сколь нибудь сложная манипуляция со строками, то всё пропало :-).
Оптимальный вариант, это статическая работа со строками - выделил на стеке, инициализировал нулями и строго следим за размером сами, при этом не забываем завершающий null символ.
Ну остальное(доступ к счётчикам, портам, АЦП) вроде как работает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 27 июл 2020, 22:09 
Старожил

Зарегистрирован: 13 фев 2011, 01:25
Сообщения: 621
Откуда: Севастополь
Какая конкатенация в стиле дельфи если у вас не инициализированы переменные ?
Код:
var S1, S2, S3: string[8];
begin
  S3 := '';
  S1 := S1 + S2;
  MyProc('K' + S1 + ':' + S3);
end;

Дельфи в этом коде присваивает за вас значение переменным S1 и S2. И с точки зрения паскаля - данный код не работоспособен потому что S1 и S2 неизвестны....
Любые переменные надо не просто объявлять но и присваивать им начальные (дефолтные) значения!
И не забывайте про выравнивание структур и данных не зависимо от языка программирования и компилятора.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Mikropascal 6.1.1 for avr кривой код ?
СообщениеДобавлено: 07 авг 2020, 20:56 
Только пришел

Зарегистрирован: 04 мар 2018, 06:58
Сообщения: 12
Откуда: Самара
Люблю PASCAL. Позволил себе — купил себе AVR Mikropascal 7 версию. Уже 3 года использую. Программы более 26-28 кБ пока не писал. Все нравится все работает, но есть два бага которые обнаружил, их нет в описании, писал на фирму — подтвердили.
Баг Первый — оператор case.
В нем стоит короткий переход по условию выбора и если вы будете в каждом выборе писать большой код, то последние выборы не работают ( команда перехода до них недобирает) и программа куда-то улетает. Выход — в каждом выборе делать вызов процедуры обработки и все.
Баг — Второй — присвоение массива массиву.
Var mas1,mas2: array[1..6] of byte;
и такое присвоение работает -
mas1:=mas2;
А вот если один или оба массива принадлежит ЗАПИСИ ( Record ), то уже не работает.
Выход — присвоение по элементно.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB