реклама на сайте
подробности

 
 
> Инициализация данных в IAR., Странное размещение инициализированных данных во flash-памяти.
helicopter
сообщение Mar 6 2013, 19:53
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 20-10-10
Пользователь №: 60 302



Нужно написать полностью собственную первичную инициализацию вместо __iar_program_start.
Попытался сделать это, как делал в GCC - .bss от начала до конца забивается нулями, а .data_init (flash) копируется в .data (sram).
Тут обнаружилась первая странность - данные в .data_init начинаются не с начала секции, а с __section_begin(".data_init") + 1 байт.
(т.е. по выравненному адресу). Сдвиг начального адреса на этот один байт ситуацию улучшил, но не полностью. Большая часть
данных теперь инициализировалась нормально, но в некоторых структурах (связанных с usb) оказался какой-то жуткий мусор, в
результате чего прошивка стала падать в из прерывания usb в FaultISR из-за обращения по несуществующему адресу.
Пытался дизассемблировать встроенную иаровскую инициализацию, но там в части копирования данных какая-то жесть. Разобраться
полностью сходу не удалось. Может кто уже сталкивался ? По какому принципу у IAR уложены данные в память ?

Контроллер LM3S5R31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ih_
сообщение Mar 14 2013, 05:57
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 2-04-08
Из: Россия, Киров
Пользователь №: 36 422



День добрый!
И у меня проблема с инициализацией sm.gif
Вводные данные:
IAR XLINK 4.60K (4.60.11.0); IAR Assembler for MSP430 V4.10A/W32 (4.10.1.9); IAR C/C++ Compiler for MSP430 V4.10A/W32 [Evaluation] (4.10.1.1)

Описание шрифта
Код
typedef     const byte             cByte;
typedef struct fontDescriptor tFontDescriptor;
struct fontDescriptor{
    cByte    width;                                // width in pixels
    cByte    hight;                                // hight in pixels
    cByte    symbolStep;                            // in pixel beetween chars
    cByte    rowStep;                            // in pixel beetwen lines
    cByte    len;                                // symbol counts -1
    cByte    offset;                                // e.g. if only digits offset=0x30
};

typedef cByte tSymbol;

typedef struct font tFont;
struct font{
    tFontDescriptor    descriptor;
    tSymbol            symbol[];
};

Инициализация шрифта из десяти цифр
Код
//tFont font3x5_10={
cByte font3x5_10[]={
// descriptor    
    0x03,0x05,0x01,0x01,0x10,0x30,
// symbols        
    0x1f,0x11,0x1f,
    0x12,0x1f,0x10,
    0x1d,0x15,0x17,
    0x15,0x15,0x1f,
    0x07,0x04,0x1f,
    0x17,0x15,0x1d,
    0x1f,0x15,0x1d,
    0x01,0x01,0x1f,
    0x1f,0x15,0x1f,
    0x17,0x15,0x1f,
};

Применение
Код
tFont              *font;
font=&font3x5_10;

Вопрос. Если в процессе инициализации константу-шрифт описать как:
cByte font3x5_10[]={.....
то компилятор выдает предупреждение: "О не совместимости типов tFont и cByte". И все работатет.
А если описать как:
tFont font3x5_10={....
то компилятор принимает только первые шесть значений дескриптора, а на сами символы говорит:" Слишком много инициализирующих данных".

Видимо нельзя в одной структуре смешивать типы разной определенности длины. Как тогда можно реализовать один тип данных на шрифты разной длины? Прошу помощи? sm.gif Благодарю.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 01:55
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016