|
Где бы взять исходники библиотек IAR 5.11 для ARM |
|
|
|
Jul 4 2008, 10:48
|
Группа: Новичок
Сообщений: 4
Регистрация: 2-11-06
Пользователь №: 21 907

|
Работаю с LPC2138 в IAR 5.11, возникла проблема: static переменным не присваивается ноль при инициализации. Хотелось бы посмотреть как работает __iar_zero_init в библитеке rt4t_al.a. У меня evaluation версия с iar.com, там исходников нет... Говорят они есть в full версии, но где ее взять?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Jul 4 2008, 15:34
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(VAI @ Jul 4 2008, 18:28)  есть исходники библиотек от 4.20a и 4.11a. Подойдут? Насколько я понимаю, не подойдут. Они там здорово поменяли стартап. Цитата(savram @ Jul 4 2008, 14:48)  Работаю с LPC2138 в IAR 5.11 А вы отключите штатную инициализацию сегментов. В своем ICF файле и инициализируйте сегменты сами. типа do not initialize { section .bss };
|
|
|
|
|
Jul 5 2008, 07:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(savram @ Jul 4 2008, 12:48)  ..возникла проблема: static переменным не присваивается ноль при инициализации. Не верю. Совсем не верю. Цитата Хотелось бы посмотреть как работает __iar_zero_init в библитеке rt4t_al.a. А там смотреть нечего - несколько команд в цикле обнуляющие заданную область памяти. Весь вопрос в том, находится-ли переменная в этой области, а к этому "библиотеки" ни сном ни духом.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 6 2008, 22:38
|
Группа: Новичок
Сообщений: 4
Регистрация: 2-11-06
Пользователь №: 21 907

|
Цитата(VAI @ Jul 4 2008, 18:28)  есть исходники библиотек от 4.20a и 4.11a. Подойдут? Подойдут! Надо узнать, что это за функция и написать ее самому. Вообще, это не единственная проблема с этой библиотекой. Изначально не работали прерывания IRQ, пришлось внести изменения cstartup.s (исходник есть) и подключить файл к проекту. Заработало. Правда полностью отключить библиотеку не могу, ругается, что нет __iar_zero_init (она как раз в библиотеке и лежит). На этом фоне не работает инициализация staticов... вот такая ерунда!
|
|
|
|
|
Jul 7 2008, 03:28
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37

|
Цитата Подойдут! http://www.rapidshare.ru/723273http://slil.ru/25962831заархивировал последним winrar-ом. Пароль на архив Без пароля. Кому не понятно, смотреть пароль под моей кошкой http://www.v572028.narod.ru/md5: 1b69d69bc383c42c1bda53a02ecb1c51 *lib.rar
--------------------
Если зайца бить, его можно и спички научить зажигать Сколько дурака не бей - умнее не будет. Зато опытнее
|
|
|
|
|
Jul 7 2008, 05:43
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
По дизассемблеру там, в частности, следующее: Код __iar_zero_init: Region$$Table$$Limit: 00000150 E3520000 CMP R2, #0x0 00000154 012FFF1E BXEQ LR 00000158 E3A01000 MOV R1, #0x0 0000015C E4801004 STR R1, [R0], #+4 00000160 E2522004 SUBS R2, R2, #0x4 00000164 1AFFFFFC BNE 0x00015C 00000168 E12FFF1E BX LR Программа такая: Код int main() { static int MyVar; return MyVar; } Оптимизация выключена, инициализация происходит как надо.
|
|
|
|
|
Jul 8 2008, 12:41
|
Группа: Новичок
Сообщений: 4
Регистрация: 2-11-06
Пользователь №: 21 907

|
icf.zip ( 706 байт )
Кол-во скачиваний: 111Цитата(zltigo @ Jul 7 2008, 10:27)  Ну что я могу сказать - после таких заявлений проблемы явно не в библиотеке, и чем Вы раньше допустите мысль, что искать нужно у себя, тем лучше. С этим-то проблем совсем ни каких нет, это первая мысль, которая возникает. Конечно, наивно винить IAR в своих бедах. Но проблема-то не исчезает... IgorKossak - спасибо, буду разбираться. Я вынужден не использовать static переменные, вместо этого инициализирую глобальные переменные в mainе. Все работает, но это не красиво как-то. Вот пример: В main.c есть такая строка static int static_variable1[10]; Потом в main делаю проверку - массив не инициализирован, содержит случайные значения. Вот что написано в *.map: Section Kind Address Size Object ------- ---- ------- ---- ------ .bss zero 0x40002468 0x28 main.o [1] Из чего делаю вывод, что переменная лежит в bss по адресу 0x40002468 (это RAM). Делаю предположение, что "zero" - директива линкеру инициализировать область нулями. Это только мое предположение, если я не прав, пожалуйста, дайте мне знать. ICF прилагаю, там тоже вроде все чисто. Буду очень признателен, если кто-нибудь даст совет где еще покопать.
|
|
|
|
|
Jul 8 2008, 13:50
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
1. static или не static по любому неинициализированвнные переменные попадают в bss 2. bss инициализируется нулями, если только специально не постараться. 3. с дуру у V5  даже проверил. 3. точка.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2008, 16:38
|
Местный
  
Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961

|
Цитата(zltigo @ Jul 8 2008, 16:50)  2. bss инициализируется нулями, если только специально не постараться. = IAR (стр 43 (67) ODARM_1.pdf). Но не каждый транслятор так делает: \begin{excerpt:link=http://focus.ti.com/lit/ug/spnu151d/spnu151d.pdf} 5.12 Initializing Static and Global Variables in TIABI and TI ARM9 ABI Modes The ANSI/ISO C standard specifies that global (extern) and static variables without explicit initializations must be initialized to 0 before the program begins running. This task is typically done when the program is loaded. Because the loading process is heavily dependent on the specific environment of the target application system, the compiler itself makes no provision for preinitializing variables at run time. It is up to your application to fulfill this requirement. \end{excerpt} -- AN
|
|
|
|
|
Jul 8 2008, 18:12
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Цитата(AndrewN @ Jul 8 2008, 19:38)  Но не каждый транслятор так делает: Подтверждаю, не каждый. Code Composer Studio от TI в своё время подвёл меня этим Цитата By default, the .bss section and sections defined with the .usect directive have no raw data (they are uninitialized). They occupy space in the memory map but have no actual contents. Но, повторяю, у IAR с инициализацией полный порядок.
|
|
|
|
|
Jul 8 2008, 20:13
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jul 8 2008, 22:01)  Да и не такой уж и кривой..... Плавали  в части MSP430... Цитата Зато отучает полагаться на "0" в bss... Ну порадовали - отучает писать на "C" и приучает писать на неком подмножестве, тратить время и место на явную маниакальную инициализацию каждой переменной, не позволяет портировать нормальный сишный ранее написанный код без глюков... Цитата ... что, я считаю, правильно. Спасибо, я пешком постою
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2008, 20:18
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(zltigo @ Jul 9 2008, 00:13)  Плавали  в части MSP430... MSP430 - единственный процессор, под который я писал в IAR'e  Но не по причине глючности студии, а просто так получилось. Цитата(zltigo @ Jul 9 2008, 00:13)  ...тратить время и место на явную маниакальную инициализацию каждой переменной Ну, во-первых, не каждой. А во-вторых, я уж лучше руками проинициализирую именно то, что мне нужно. И далеко не всегда нулями.
|
|
|
|
|
Jul 8 2008, 20:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jul 8 2008, 22:18)  А во-вторых, я уж лучше руками проинициализирую именно то, что мне нужно. Смысла в раздумьях, что инициализировать, что нет нет никакого, как и монотонной в ручной работе по инициализации, как и в раздумьях проскаивать на красный свет или нет.... По любому стандарт "C" придумал не TI и не ему на него плевать. Добавлять опции полного или частичного отключения инициализации, это их право, а вот тупо выбрасывать инициализацию статически выделяемой памяти - свинство. Цитата И далеко не всегда нулями. Про не нули речь не идет, но тем не менее в большинстве случаев 0 это нормальное значение, а остальные переменные просто доинициализировать через data или явно нужными зачениями при необходимости.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2008, 20:51
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(aaarrr @ Jul 8 2008, 22:42)  Возможно, но трагедии здесь не вижу... Я, например, не вижу ни малейшей трагедии в ручной инициализации динамически выделенной памяти, по тому, что знаю, что она не будет инициализирована согласно принятому стандарту языка. А вот в необходимости инициализировать память, которая должна быть согласно стандарту инициализирована, напротив, я вижу банальное свинство и не намерен пользоваться такими "продуктами".
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 8 2008, 22:23
|
Местный
  
Группа: Участник
Сообщений: 336
Регистрация: 7-03-07
Из: Петербург
Пользователь №: 25 961

|
Кхм... Не очень я люблю цитировать Шекспира, но - "Much ado abouth nothing" - по моему строчка вполне подходит. Ну это шутка. Цитата(zltigo @ Jul 8 2008, 23:32)  По любому стандарт "C" придумал не TI и не ему на него плевать. Добавлять опции полного или частичного отключения инициализации, это их право, а вот тупо выбрасывать инициализацию статически выделяемой памяти - свинство. По существу, разумеется стандарт ANSI C (если речь шла о нем) никто не отменял; я не уточнил, что есть опция -fill в линкере TI, которая восстанавливает "инициализационное" поведение предусмотренное ANSI C; правда инициализирующая константа может отличатся от нуля. Этакий суперсет. С другой стороны, ANSI C вовсе не застывшая и всеопределяющая формулировка - ещё есть K&R и K&R 2nd ed., и embedded C, и GNU C и вероятно еще что-нибудь, о чём я и не подозревал, и все они в чём-нибудь да отличаются от "девственого" ANSI C, который кстати тоже насчитывает пару редакций (или уже больше?). Отсюда с необходимостью следует, что любой код на С - это код на подмножестве С, и портируемость кода на С это скорее миф а реальность - это строки #ifdef (ARCH_XXXX) или ifdef (COMPILER_XXXX) - наподобие __STDC__ и __GNU_C__ и так далее. Самый лучшй способ, на мой взгляд, бороться с такими тонкостями (с позволения) - знать о них. Я, собственно, только это изначально и отметил, а вовсе не собирался затевать очередную священную войну за веру. Маленькая поправка: набор компиляторов TI генерирует машинный код для самых разных архитектур (от CISC-like С2000 до RISC ARM и multiple-issue C6000) - он совсем уже не сырой а вполне прожаренный, well-done, говоря кулинарным языком ANSI. -- AN
Сообщение отредактировал AndrewN - Jul 8 2008, 22:46
|
|
|
|
|
Aug 30 2011, 11:21
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(zltigo @ Jul 5 2008, 11:36)  Цитата ..возникла проблема: static переменным не присваивается ноль при инициализации.
Не верю. Совсем не верю. Такая проблема есть. Сегодня наткнулся. Исследования показали следующее: Допустим, есть массив: static int BigArray[QuiteLargeValue] = 0; Можно "=0" и убрать, разницы никакой. В конфиге ICF имеем строку: place in RAM_region { readwrite, block CSTACK, block HEAP }; Однозначно видно, что линкер пытается разложить блоки в регионе по убыванию размера. Так вот если массив оказывается большего размера, чем CSTACK или HEAP, то видим такую картину: Код "P2", part 1 of 5: 0x3840 .bss zero 0x1000001c 0x3840 Array.r79 [1] - 0x1000385c 0x3840
"P2", part 2 of 5: 0x2480 HEAP 0x10003860 0x2000 <Block> HEAP uninit 0x10003860 0x2000 <Block tail> CSTACK 0x10005860 0x300 <Block> CSTACK uninit 0x10005860 0x300 <Block tail> .iar.dynexit 0x10005b60 0x180 <Block> .iar.dynexit uninit 0x10005b60 0xc cppinit.o [15] .iar.dynexit uninit 0x10005b6c 0x174 <Block tail> - 0x10005ce0 0x2480
"P2", part 3 of 5: 0xc P2 s0 0x10005ce0 0xc <Init block> .data inited 0x10005ce0 0x4 file1.r79 [4] .data inited 0x10005ce4 0x4 file2.r79 [9] .data inited 0x10005ce8 0x4 cppinit.o [15] - 0x10005cec 0xc
"P2", part 4 of 5: 0x217c .bss zero 0x10005cec 0x1024 mem.r79 [9]
... Наш блок Array попал в сегмент .bss, чего мы и хотели, однако, код для его инициализации не был сгенерирован линкером! Линкер начал забивать нулями область, начиная в данном случае с адреса 0x5cec. Если же уменьшить размер массива так, чтобы он оказался меньше кучи и стека, то он попадет к "остальным" членам .bss и все переменные проинициализируюутся. Конечно, уменьшать массив это не выход, поэтому есть другой вариант обхода проблемы в конфиге линкера: Код place in RAM_region { readwrite }; place in RAM_region { block CSTACK, block HEAP }; Тогда сегмент .bss не будет разорван данными с другими атрибутами и инициализация пройдет нормально.
|
|
|
|
|
Aug 31 2011, 10:27
|
Профессионал
    
Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882

|
Советую просто поставить последнюю версию IAR В 6.10 у меня тоже была проблема с инициализацией. В *.map надо смотреть на содержимое INIT TABLE Код ******************************************************************************* *** INIT TABLE ***
Address Size ------- ---- Zero (__iar_zero_init3) 2 destination ranges, total size 0x674a: 0x10000148 0x2e3a 0x2007c000 0x3910
Copy/packbits (__iar_packbits_init3) 1 source range, total size 0x33 (15% of destination): 0x00013b78 0x33 1 destination range, total size 0x144: 0x10000004 0x144 В 6.1 Создавался только один диапазон инициализации.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|