Я не знаю, назову ли я это сбоем, но sdcc ( Компилятор малого устройства C ) не может компилировать код, сформированный определенным образом:
- Цель: 8051
- Код должен был выполняться в 512-байтовом кеше, загруженном с внешнего тестера
- Тестер контролирует и хранит код - кеш не может получить следующую страницу
- Запрещены вызовы функций - ПК (счетчик программ) будет переходить на место, не находящееся в кеше; макросы препроцессора были использованы для выполнения практики модульного кодирования
- Переходы (ветвления) разрешены, если они не пропускаются из кэша
- Нет константных значений - в разделе данных программного кода, который заставляет код в кеше извлекать что-то, не находящееся в кеше - константа препроцессора (#define) OK здесь
Макросы препроцессора развертываются, в результате чего получается плоский, но большой код - все в main (); выполнение пропускает код запуска (настройка стека и т. д.) и начинается в начале функции main ()
Соответствующая часть этого ответа:
Иногда sdcc отказывается компилировать синтаксически правильный код с сообщением о нехватке памяти. Это даже произошло при компиляции на 64-битных компьютерах с 8 ГБ оперативной памяти.
Решением в этих случаях было разделить прошивку на отдельные части, скомпилировать их отдельно и выполнить отдельно. Кусочки могли быть связаны между собой, но на тот момент это не имело значения.
Я не пробовал, но компилятор Keil 8051, вероятно, мог бы обработать проблемный код.