Переполнение небольшой области данных Green Hills Sw
Я пытаюсь скомпилировать встроенный код C, но происходит небольшое переполнение области данных. Я знаю, что это значит, но я не знаю, как это решить. Кто-нибудь может сделать предложение?
Итак, проблема в том, что существует регистр r13, который является базовым указателем sda, и он имеет длину 16 бит. Он подписан, поэтому он указывает на середину sda и может использоваться как смещение для получения заданного значения переменной.
Если переменная будет указана для помещения в sda с помощью #pragma ghs startda, то она будет адресована sda_base+r13, если переменная находится по адресу, который не может быть адресован этим смещением base+register, то сообщается о переполнении sda.
Как я могу найти причину переполнения? Если у меня еще нет файла карты, я не знаю переменных адресов.
2 ответа
Смотрите мой ответ на предыдущий вопрос здесь: /questions/22911022/greenhills-perepolnenie-nebolshoj-oblasti-dannyih/22911030#22911030
По сути, вы должны использовать время соединения -auto_sda
а не время компиляции #pragma ghs startsda
; последнее не очень полезно, если компоновщик (elxr) может выполнить SDAization за вас, и это может привести к ошибкам компоновщика, если все ваши файлы.o, объединенные вместе, поместят более 64 КБ в раздел SDA.
Компоновщик Green Hills может автоматически "SDAize" данные, которые были назначены компилятором .data
; но он не может автоматически "де-SDAize" данные, которые компилятор уже назначил .sdata
, (По крайней мере, это не могло произойти в 2011 году, и я сомневаюсь, что это изменилось с 2014 года.)
Вам нужно проверить, чтобы увидеть конфигурацию вашего компилятора. Компилятор может автоматически помещать данные в область.sda. Я забыл точный флаг, но вы можете исключить данные больше, чем определенный размер из.sda. Например, вы можете сказать, что вещи больше чем 64-битные не входят в sda. Таким образом, большой буфер, который вы определяете, не тратит все ваше пространство sda.