16+
Понедельник
18 ноября
Вход |Карта сайта |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Микроконтроллеры AVR

 
Новая темаПравила РегистрацияСтатистика Архив
Вернуться в конференциюТопик полностью
0men  (07.12.2012 17:01 - 07.12.2012 17:05, просмотров: 4474)
Коллеги, нарыл в 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
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7528 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXIX