ВходНаше всё Теги codebook PARTS Поиск Опросы Закон Среда
3 июня
/374409
0men (07.12.2012 17:01 - 17:05, просмотров: 4800)
Коллеги, нарыл в IAR 6.12.1 охрененную ошибку (но хочется верить, что я где-то сам не догоняю, в 5.11В все ок) Предыстория: Решил попробовать новый яр. Проект для меги1281. Размер около 80000 байт флэша. После компиляции и прошивки в прибор выяснилось, что строковые константы из флэша (на самом деле есно в фунцию передается адрес константы) передаваемые в функцию вот так: Func( "тралала" ); тогда как вот такой код работает верно __farflash unsigned char str[] = "тралала"; Func( str ); Func объявлена как void Func( const unsigned char __farflash * ) Пробовал и void Func( const unsigned char __hugeflash * ) не помогает. В отладчике видно, что адрес строкового литерала в функцию передается посредством 3 байт (что правильно для __farflash) через регистры R16,R17, R18 но старший байт (R18) равен 0х00!!!! Такое чувство, что он просто маскируется при это варианте Func( "тралала" ); при просмотре памяти видно, что "тралала" лежит выше 0xffff Сие проверить элементарно: создаете проект #pragma language=extended #include <iom1281.h> #include <inavr.h> #include "uart.h" void TransmitStrA ( const unsigned char __farflash * str ) { // это чтобы хитрожопый оптимизатор ничего не выбросил TransmitByte( str[ 0 ] ); TransmitByte( str[ 1 ] ); TransmitByte( str[ 2 ] ); TransmitByte( str[ 3 ] ); } void main( void ) { TransmitStrA( "FUCK!!!" ); } в настройках выбираете конфигурацию системы из XCL файла в это файле ремируете строчку -P(CODE)FAR_F=[_..X_INTVEC_SIZE-_..X_FLASH_END]/10000 и добавляете 3 строки -D_..X_FLASH_START_MY=12345 -D_..X_FLASH_END_MY=1ffff -P(CODE)FAR_F=_..X_FLASH_START_MY-_..X_FLASH_END_MY Это чтобы хитрожопый компилятор расположил данные и код выше 0x12345 Открываем отладчик и смотрим куда покладен FUCK!!! и какой адрес реально передается в функцию Смотрите картинку в аплоаде 123.jpg
Ответить
Ответы