среда, 17 сентября 2014 г.

Про Pascal, который не совсем Pascal

Вернее, про mikroPascal... Очень интересное семейство компиляторов у этой Микроэлектроники из Белграда. Но с одним «но»: все библиотеки там «сишные». С ядрёными сишными приколами. Как, например, в отношении строк, когда заносимый в строку параметр запросто уходит за её конец при отсутствии контроля длин и начинает что-то там перекрывать в памяти (червь Морриса, кстати, использовал именно этот эффект). Ну и т.п. Для пишущего на Pascal всё это в определенной степени «нежданчик», т.к. компилятор об этом молчит просто «как рыба об лёд». Когда впервые это увидел, то с перепугу решил было, что это издохший китайский программатор USBasp покалечил заодно и микроконтроллер (мусор на ЖКИ, сбои тактирования и т.п.).

В процессе отладки выяснил следующий недокументированный нюанс: при передаче строк вывода библиотечным функциям LCD, они должны быть представлены в виде String_To_Out : array [L] of char, где параметр L равен длине выводимой текстовой строки (т.к. по умолчанию индексы массивов и строк начинаются с нуля), а значение String_To_Out[L] равно 0x00. Т.е. надо принудительно «затыкать» выводимую строку нулевым символом. Если этого не делать – при выводе строк через функции библиотеки LCD портится память, со всеми вытекающими последствиями.

Что-то пошло не так!

1 комментарий:

  1. Сишные библиотеки – это, конечно, ад при «должном» документировании. В новом хелпе, например, для LCD указан тип передаваемой строки вывода как string[x]. А вот в старом мануале – array[x] of char. Переписал микропрограмму... и опять «здасссте, приехади» – нихрена не работает. Более чем уверен – в конверсионных операциях и при выводе придется вернуться от стрингов к эррейофчарам.

    ОтветитьУдалить

Ваш комментарий откроется после проверки и подтверждения.
Благодарю за понимание необходимости проверки!