0men (07.12.2012 17:01 - 17:05, просмотров: 9744)
Коллеги, нарыл в 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