Разрастается наш проект пользовательского интерфейса для наших
частотников на DWINe. Поскольку это сделано в виде съемной панели
управления, в которой, кроме Двина, других процессоров нет,
используем его второе ядро C51, в отличие от большинства
разработчиков, которые общаются только с графическим ядром Двина со
своего процессора. Программируем его на Кейле. До недавнего времени
все работало шикарно, взаимодействие с графическим ядром,
отображение графиков в реальном времени, связь с головным устройством через модбас, обслуживание кнопок и энкодера и еще много всего. Но как только объем программы перевалил за 32Кб, начались неожиданные глюки, достаточно переставить пару строк в коде, и все ломается. В ядре С51 вторые 32кб памяти требуют для обращения другую команду, и компилятор ее использует, смотрели ассемблерный листинг. Однако все равно бессистемно возникают глюки. Программист не может понять причину уже 3 дня. Может мы не знаем какую-то особенность ядра С51? Жалобы нашего программиста (цитата):
Подскажите пожалуйста, пишу код для DMG32240F028_01WN на базе T5L0 может кто-нибудь сталкивался с такой проблемой, что если размер программы начинает превышать 32 Кб, то программа начинает ломаться.
Например, если я добавляю какой-нибудь код, не связанный с логикой программы, то часть функций может перестать работать.
Если я добавляю еще какого-нибудь кода, то одни функции могут опять начать работать, а другие поломаться. При чем может поломаться часть функций расположенных как и в первой половине флеша, так и во второй, и также внезапно начать работать.
Но если размер кода в пределах 32 кб, то все работает корректно
Посмотрел в ассемблерном коде используется LCALL/LJMP вместо ACALL/AJMP (что корректно, и должно работать на весь размер флеша)
В настройках Keil C51 у меня стоит Large: 64K program и в целом все по инструкции https://static.dwin.pro/share/guides_ru/1.%20%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0%20%D1%81%D1%80%D0%B5%D0%B4%D 1%8B%20Keil%20%D0%B4%D0%BB%D1%8F%20DWIN%20-%20T5L%20-%20OS%20C51.pdf
И вот даташит на дисплей https://storage.sea.com.ua/tech_info/DVIN/DMG32240F028_01WN.pdf