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

 
 
> Инициализация данных в 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
Ответов (1 - 6)
scifi
сообщение Mar 7 2013, 04:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



У меня в папке iar\arm\src\lib\init лежат исходники процедур инициализации данных. Может быть, у вас тоже?
Go to the top of the page
 
+Quote Post
helicopter
сообщение Mar 9 2013, 14:46
Сообщение #3





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



Цитата(scifi @ Mar 7 2013, 08:20) *
У меня в папке iar\arm\src\lib\init лежат исходники процедур инициализации данных. Может быть, у вас тоже?

Спасибо, но к сожалению я не нашёл там функцию __iar_packbits_init3.

P.S. В первом сообщении опечатался, где "(т.е. по выравненному адресу)" - я хотел написать: "т.е. по невыравненному адресу". Потому этот факт меня сильно удивил.
Go to the top of the page
 
+Quote Post
helicopter
сообщение Mar 9 2013, 18:54
Сообщение #4





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



Может существует способ как-то заставить его укладывать данные в память по человечески ? В скрипте линкера указать или ещё как-нибудь ?

Кажется нашёл: http://en.wikipedia.org/wiki/PackBits
Вопрос: "Можно ли это как-то отключить ?", - остаётся в силе. Если у кого-то есть готовая реализация на си, тоже буду благодарен.

Сообщение отредактировал helicopter - Mar 9 2013, 18:56
Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 9 2013, 19:29
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(helicopter @ Mar 9 2013, 22:54) *
Можно ли это как-то отключить ?

Почитайте документ "EWARM Development Guide". Ищите в тексте "initialize by copy".
Go to the top of the page
 
+Quote Post
helicopter
сообщение Mar 13 2013, 11:25
Сообщение #6





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



Scifi, большое спасибо. Замена initialize by copy на initialize manually with packing=none решило проблему.
Go to the top of the page
 
+Quote Post
ih_
сообщение Mar 14 2013, 05:57
Сообщение #7


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 21st July 2025 - 23:18
Рейтинг@Mail.ru


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