0men (06.12.2012 21:29, просмотров: 1722)
Коллеги, нарыл в 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), но старший байт равен 0х00!!!! Такое чувство, что он просто маскируется при это вариантеFunc( "тралала" );при просмотре памяти видно, что "тралала" лежит выше 0xffffСие проверить элементарно: создаете проект#pragma language=extended#include #include #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!!! и какой адрес реально передается в функцию