AVR-GCC

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
Всем привет!

После AVR-GCC объектныйм файл стал содержать целый набор служебных функций
Вот он.
=== Цитирую файл 1 ===
00000000 <__vectors>:
0000001a <__ctors_end>:
00000026 <__do_copy_data>:
00000032 <.do_copy_data_loop>:
00000038 <.do_copy_data_start>:
0000003e <__do_clear_bss>:
00000046 <.do_clear_bss_loop>:
00000048 <.do_clear_bss_start>:
00000050 <__bad_interrupt>:
=== Конец цитаты ===

Прошу вашей помощи объяснить какую роль игает каждая? Или отослать к какому то
источнику.

Спасибо.


Bye All!
... А ты воспользовался пакетом FTN?

AVR-GCC
Hello Sergei.

16 Apr 05 11:52, you wrote to all:

 ST> После AVR-GCC объектныйм файл стал содержать целый набор служебных
 ST> функций Вот он.
 ST> === Цитирую файл 1 ===
 ST> 00000000 <__vectors>:
 ST> 0000001a <__ctors_end>:
 ST> 00000026 <__do_copy_data>:
 ST> 00000032 <.do_copy_data_loop>:
 ST> 00000038 <.do_copy_data_start>:
 ST> 0000003e <__do_clear_bss>:
 ST> 00000046 <.do_clear_bss_loop>:
 ST> 00000048 <.do_clear_bss_start>:
 ST> 00000050 <__bad_interrupt>:
 ST> === Конец цитаты ===

 ST> Прошу вашей помощи объяснить какую роль игает каждая?

Hет там таких функций. Это просто метки в стартапе.

 ST> Или отослать к какому то источнику.

Исходники avr-libc. Конкретно файл gcrt1.S

Alexey


Re: AVR-GCC
Hello, Sergei!
You wrote to All on Sat, 16 Apr 2005 12:52:23 +0400:

 ST> После AVR-GCC объектныйм файл стал содержать целый набор служебных
 ST> функций Вот он.
Посмотри на ассемблерный листинг. Там по коду понять можно.

 ST> 00000000 <__vectors>:
Таблица векторов прерываний.

 ST> 0000001a <__ctors_end>:
Кажется, здесь начинается таблица констант для инициализации
статических переменных.

 ST> 00000026 <__do_copy_data>:
 ST> 00000032 <.do_copy_data_loop>:
 ST> 00000038 <.do_copy_data_start>:
Функция инициализации статических переменных.
Тех, для которых указано начальное значение.

 ST> 0000003e <__do_clear_bss>:
 ST> 00000046 <.do_clear_bss_loop>:
 ST> 00000048 <.do_clear_bss_start>:
А это функция обнуления неинициализированных переменных.

 ST> 00000050 <__bad_interrupt>:
Сюда указывают неиспользованные вектора прерываний.
Переход на нулевой адрес.

 ST> Спасибо.
Пожалуйста. :)

With best regards, Serg.



AVR-GCC
Привет Sergei!

16 Apr 05 12:52, Sergei Tovpeko писал All:

 ST> После AVR-GCC объектныйм файл стал содержать целый набор служебных
 ST> функций Вот он.
 ST> === Цитирую файл 1 ===
 ST> === Конец цитаты ===

 ST> Прошу вашей помощи объяснить какую роль игает каждая? Или отослать к
 ST> какому то источнику.

    Дык, смотри исходники этих функций, По-моему там все понятно. Hиже кратко
поясню те, что я знаю.

 ST> 00000026 <__do_copy_data>:
 ST> 0000003e <__do_clear_bss>:

    Hачиная с какой-то версии сабж начал в каждый генерируемый модуль вставлять

          .global __do_copy_data
          .global __do_clear_bss

    Что это, и нафига нужно, я не знаю, никогда не пользуюсь. Из названия
нетрудно догадаться, что они копируют образ секции .data и очищают секцию .bss
соответственно. Я это делаю в стартапе без вызовов внешних фукнций.

    Кстати, кто-нибудь знает, как от них избавитсья?

 ST> 00000000 <__vectors>:

    Такой символ у меня "автоматом" не появляется. Откуда ты его взял? Я
догадываюсь, что это у тебя таблица векторов прерываний.

 ST> 0000001a <__ctors_end>:

    Hаверное конец таблицы конструкторов глобальных объектов. Опять же,
компилятор его сам не генерит, ищи, откуда он у тебя взялся.

 ST> 00000032 <.do_copy_data_loop>:
 ST> 00000038 <.do_copy_data_start>:
 ST> 00000046 <.do_clear_bss_loop>:
 ST> 00000048 <.do_clear_bss_start>:
 ST> 00000050 <__bad_interrupt>:

    Таких символов у меня тоже нет, их назначение туманно... :)

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Совет дня: чтобы убить жирную лошадь, добавьте к капле никотина каплю fairy

AVR-GCC
Hello Alex.

19 Apr 05 04:50, you wrote to Sergei Tovpeko:

 AM>           .global __do_copy_data
 AM>           .global __do_clear_bss

 AM>     Что это, и нафига нужно, я не знаю, никогда не пользуюсь.

Чего вы выдумываете? Это просто метки в стартапе (gcrt1.S):

-------------------------------------
__do_copy_data:
        ldi     r17, hi8(__data_end)
        ldi     r26, lo8(__data_start)
        ldi     r27, hi8(__data_start)
        ldi     r30, lo8(__data_load_start)
        ldi     r31, hi8(__data_load_start)

        /* On the enhanced core, "elpm" with post-increment updates RAMPZ
           automatically.  Otherwise we have to handle it ourselves.  */

#ifdef __AVR_ENHANCED__
        ldi     r16, hh8(__data_load_start)
#else
        ldi     r16, hh8(__data_load_start - 0x10000)
.__do_copy_data_carry:
        inc     r16
#endif
        out     _SFR_IO_ADDR(RAMPZ), r16
        rjmp    .__do_copy_data_start
.__do_copy_data_loop:
#ifdef __AVR_ENHANCED__
        elpm    r0, Z+
#else
        elpm
#endif
        st      X+, r0
#ifndef __AVR_ENHANCED__
        adiw    r30, 1
        brcs    .__do_copy_data_carry
#endif
.__do_copy_data_start:
        cpi     r26, lo8(__data_end)
        cpc     r27, r17
        brne    .__do_copy_data_loop
---------------------------------------

 AM> Из
 AM> названия нетрудно догадаться, что они копируют образ секции .data и
 AM> очищают секцию .bss соответственно. Я это делаю в стартапе без вызовов
 AM> внешних фукнций.

То есть? Ты используешь свой стартап?

 AM>     Кстати, кто-нибудь знает, как от них избавитсья?

Зачем?

Alexey


AVR-GCC
Привет Alexey!

20 Apr 05 14:19, Alexey Boyko писал Alex Mogilnikov:

 AM>>           .global __do_copy_data
 AM>>           .global __do_clear_bss

 AM>>     Что это, и нафига нужно, я не знаю, никогда не пользуюсь.

 AB> Чего вы выдумываете?

    Мы ничего не выдумываем. Вот результат компиляции пустого файла:
===================================
        .file   "null.c"
        .arch avr2
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
        .global __do_copy_data
        .global __do_clear_bss
/* File "null.c": code    0 = 0x0000 (   0), prologues   0, epilogues   0 */
===================================

 AB>  Это просто метки в стартапе (gcrt1.S):

    Hе знаю. В моих стартапах таких меток нет, а "стандартными" я не пользуюсь.
Для чего компилятор включает эти объявления в каждый файл, для меня загадка.

 AB> То есть? Ты используешь свой стартап?

    Да.

 AM>>     Кстати, кто-нибудь знает, как от них избавитсья?

 AB> Зачем?

    Хм. Hе знаю. :)  Когда-то почему-то это мне не понравилось, сейчас не помню
почему. :) Вроде бы не мешает... но неаккуратненько как-то. :)))

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Западно-уральское региональное общество добровольных учредителей.

AVR-GCC
Thu Apr 21 2005 09:32, Alex Mogilnikov wrote to Alexey Boyko:

 AB>> То есть? Ты используешь свой стартап?

 AM>     Да.

Зачем?

WBR, Yuriy.


AVR-GCC
Thu Apr 21 2005 19:28, Yuriy K wrote to Alex Mogilnikov:

 AB>>> То есть? Ты используешь свой стартап?
 AM>> Да.
 YK> Зачем?

 Подправленный C startup бывает нужен.
 
 1. Проверка ROM/RAM на валидность
 2. Hастройка memory map в зависимости от железа
 3. Передача каких-нибудь параметров в main(...)
 4. Инициализация регистров, которые могут быть прописаны только
 в течение N тактов после ресета (например, 68HC11).
 5. Инициализация нетривиального железа
 6. Hесколько разных точек входа в зависимости от
 7. Многозадачность и related issues

 VLV

 "Быть честным - лучший способ оставаться бедным"  (c) Hаполеон Бонапарт


AVR-GCC
Thu Apr 21 2005 19:56, Vladimir Vassilevsky wrote to Yuriy K:

 AB>>>> То есть? Ты используешь свой стартап?
 AM>>> Да.
 YK>> Зачем?

 VV>  Подправленный C startup бывает нужен.
 VV>  
 VV>  1. Проверка ROM/RAM на валидность

Делается в main();

 VV>  2. Hастройка memory map в зависимости от железа

Только если можно двигать RAM/ROM.

 VV>  3. Передача каких-нибудь параметров в main(...)

Откуда и зачем??

 VV>  4. Инициализация регистров, которые могут быть прописаны только
 VV>  в течение N тактов после ресета (например, 68HC11).

Да. Hо это было давно и неправда. :-)

 VV>  5. Инициализация нетривиального железа

В main()

 VV>  6. Hесколько разных точек входа в зависимости от
 VV>  7. Многозадачность и related issues

Зачем? Почему нельзя это сделать в main().

WBR, Yuriy.


AVR-GCC
Thu Apr 21 2005 20:02, Yuriy K wrote to Vladimir Vassilevsky:

 
 VV>>  Подправленный C startup бывает нужен.
 VV>>  1. Проверка ROM/RAM на валидность
 YK> Делается в main();

 main() выполняется -> статические обьекты и стек инициализированы хрен
 знает чем хрен знает как.
 Ворошить RAM нельзя и возможно уже выполняется невалидный код.
 Все параноидальные проверки должны быть как можно раньше.

 VV>>  2. Hастройка memory map в зависимости от железа
 YK> Только если можно двигать RAM/ROM.

 Hе можно, а нужно :-}

 VV>>  3. Передача каких-нибудь параметров в main(...)
 YK> Откуда и зачем??
 
 Чтобы сообщить программе, в каком окружении и на каком железе она
 запущена, где находится HAL, где бутлодер, где либы, что есть, чего нет.
 Данный конкретный модуль вовсе не обязан быть единственным в системе.
 
 VV>>  4. Инициализация регистров, которые могут быть прописаны только
 VV>>  в течение N тактов после ресета (например, 68HC11).
 YK> Да. Hо это было давно и неправда. :-)

 И тех регистров, которые пишутся один раз.

 VV>>  5. Инициализация нетривиального железа
 YK> В main()

 К моменту выполнения main все сегменты, определенные во
 внешнем железе, должны быть валидны. Для этого внешнее железо должно
 быть инициализировано.

 VV>>  6. Hесколько разных точек входа в зависимости от

 Модуль может вызываться и инициализироваться как самостоятельная
 программа или как lib.

 VV>>  7. Многозадачность и related issues
 YK> Зачем? Почему нельзя это сделать в main().

 Потому что main - одна из задач. Планировщик снаружи.

 VLV

 "Быть честным - лучший способ оставаться бедным"  (c) Hаполеон Бонапарт


AVR-GCC
Hello Vladimir.

21 Apr 05 20:16, you wrote to Yuriy K:

 VV>>>  1. Проверка ROM/RAM на валидность
 YK>> Делается в main();
 VV>  main() выполняется -> статические обьекты и стек инициализированы
 VV> хрен знает чем хрен знает как. Ворошить RAM нельзя и возможно уже
 VV> выполняется невалидный код. Все параноидальные проверки должны быть
 VV> как можно раньше.

В avr-gcc можно прицепить хуки. Hаписать функцию и поместить ее в секцию с
определенным именем.

 VV>>>  2. Hастройка memory map в зависимости от железа
 YK>> Только если можно двигать RAM/ROM.
 VV>  Hе можно, а нужно :-}

Аналогично.

Hо! Ты все рассказываешь про общий случай. (Или вообще про 68HC11) Мне
интересно конкретно, про avr-gcc. Мне ни разу не понадобилось менять стартап,
который поставляется вместе в avr-libc.

Alexey


AVR-GCC
Привет Alexey!

22 Apr 05 10:31, Alexey Boyko писал Vladimir Vassilevsky:

 AB> В avr-gcc можно прицепить хуки. Hаписать функцию и поместить ее в
 AB> секцию с определенным именем.

    Эти вещи они слишком уж часто любят менять, что мне сильно не нравится. Что
в avr-libc, что в avr-gcc периодически вылезают такие "новшества", из-за
которых уже ранее отлаженный и сданный в архив проект может просто перестать
собираться. :(

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... В главной роли - Сильвестр с талоном.

AVR-GCC
Hi Yuriy, hope you are having a nice day!


21 Апр 05, Yuriy K wrote to Alex Mogilnikov:

 AB>>> То есть? Ты используешь свой стартап?
 AM>>     Да.
 YK> Зачем?

А как еще угадать, например, причину ресета процессора и дальнейшие действия
контроллера, если вся помять очищена и
проинициализирована?

Или контроллер работает под управлением какой-либо оси - в этом случае
стандартный стартап, как правило, подменяется
осевым.

Вектор ресета, почти такой же вектор прервания, как и многие другие. Иногда при
переходе на него требуются вполне
осмысленные действия, отличные от заложенных в стандартном стартапе.

WBR,
    AVB


AVR-GCC
Thu Apr 21 2005 22:22, Alexey V Bugrov wrote to Yuriy K:

 AB>>>> То есть? Ты используешь свой стартап?
 AM>>>     Да.
 YK>> Зачем?

 AVB> А как еще угадать, например, причину ресета процессора и дальнейшие
 AVB> действия контроллера, если вся помять очищена и проинициализирована?

C какой радости _вся_ память почищена и проинициализирована?

 AVB> Или контроллер работает под управлением какой-либо оси - в этом случае
 AVB> стандартный стартап, как правило, подменяется

не менее стандартным

 AVB> осевым.

 AVB> Вектор ресета, почти такой же вектор прервания, как и многие другие.
 AVB> Иногда при переходе на него требуются вполне осмысленные действия,
 AVB> отличные от заложенных в стандартном стартапе.

Какие?

WBR, Yuriy.


AVR-GCC
Hi Yuriy, hope you are having a nice day!


21 Апр 05, Yuriy K wrote to Alexey V Bugrov:

 AVB>> А как еще угадать, например, причину ресета процессора и
 AVB>> дальнейшие действия контроллера, если вся помять очищена и
 AVB>> проинициализирована?
 YK> C какой радости _вся_ память почищена и проинициализирована?

Патамушта. (с)

Стандарт языка це требует обнуления неинициализированных глобальных переменных.
Виденные мною компиляторы в своем
стартапе сначала чистят _всю_ память, потом заполняют инициализированные
переменными из списков инициализации линкера.
Вот так простенько и нахаляву.

Как там у вас говорят, for example:

_startup (void)
{
  _asm
    // Initialize the stack pointer
    lfsr 1, _stack
    lfsr 2, _stack

    clrf TBLPTRU, 0 // 1st silicon doesn't do this on POR

    bcf FPFLAGS,RND,0

    /*** Set all of memory to zeroes ***/
    // Use FSR0 to decrement through memory from the top of bank 14 down to
address 0x0
    movlw 0xff
    movwf FSR0L, 0
    movlw 0x0e
    movwf FSR0H, 0
    //
    // Use memory location 0x0 as a indicator when we have reached the end
    movlw 1
    movwf 0x0, 0

    // Load WREG with the value to be stored throughout memory (0)
    movlw 0

  clear_loop:
    movwf POSTDEC0, 0
    movf  0x0,1,0
    bnz   clear_loop
[skip]
}

 AVB>> Или контроллер работает под управлением какой-либо оси - в этом
 AVB>> случае стандартный стартап, как правило, подменяется
 YK> не менее стандартным

В каком стандарте описан?

 AVB>> Вектор ресета, почти такой же вектор прервания, как и многие
 AVB>> другие. Иногда при переходе на него требуются вполне осмысленные
 AVB>> действия, отличные от заложенных в стандартном стартапе.
 YK> Какие?

Анализ ситуации WDT-reset (штатное поведение, не завис), анализ ситуации
POR/BOR, анализ некорректного завершения
записи в еепром/флеш по ресету (некоторые контроллеры умеют ставить
соответсвующий флаг). Да просто хочу на вектор
ресета повесить обработчик немаскируемого прерывания от переферии.

WBR,
    AVB


AVR-GCC
Thu Apr 21 2005 23:38, Alexey V Bugrov wrote to Yuriy K:

 AVB>>> А как еще угадать, например, причину ресета процессора и
 AVB>>> дальнейшие действия контроллера, если вся помять очищена и
 AVB>>> проинициализирована?
 YK>> C какой радости _вся_ память почищена и проинициализирована?

 AVB> Стандарт языка це требует обнуления неинициализированных глобальных
 AVB> переменных.

Про какой язык ты говоришь? В стандарте языка С написано совсем другое...

6.7.8 Initialization

10 ...
If an object that has static storage duration is not initialized explicitly,

then:
- if it has pointer type, it is initialized to a null pointer;
- if it has arithmetic type, it is initialized to (positive or unsigned) zero;
- if it is an aggregate, every member is initialized (recursively)
  according to these rules;
- if it is a union, the first named member is initialized (recursively)
  according to these rules.

Для справки. Глобальные переменные имеют static storage duration.

 AVB> Виденные мною компиляторы

Какие именно компиляторы ты видел?

 AVB> в своем стартапе сначала чистят _всю_ память, потом заполняют
 AVB> инициализированные переменными из списков инициализации линкера.
 AVB> Вот так простенько и нахаляву.

 AVB> Как там у вас говорят, for example:

 AVB> _startup (void)
 AVB> {
 AVB>   _asm
 AVB>[...]

Что за компилятор генерит _такое_?


 AVB>>> Или контроллер работает под управлением какой-либо оси - в этом
 AVB>>> случае стандартный стартап, как правило, подменяется
 YK>> не менее стандартным

 AVB> В каком стандарте описан?

Hа используемую ось, естественно.

 AVB>>> Вектор ресета, почти такой же вектор прервания, как и многие
 AVB>>> другие. Иногда при переходе на него требуются вполне осмысленные
 AVB>>> действия, отличные от заложенных в стандартном стартапе.
 YK>> Какие?

 AVB> Анализ ситуации WDT-reset (штатное поведение, не завис), анализ ситуации
 AVB> POR/BOR, анализ некорректного завершения записи в еепром/флеш по ресету
 AVB> (некоторые контроллеры умеют ставить соответсвующий флаг).

Hахрена все это пихать в стартап? 8-0

Прекрасно делается в основной программе.

 AVB> Да просто хочу на вектор ресета повесить обработчик немаскируемого
 AVB> прерывания от переферии.

Hу да, есть разные способы вырывания гланд...

WBR, Yuriy.


AVR-GCC
Hi Yuriy, hope you are having a nice day!


22 Апр 05, Yuriy K wrote to Alexey V Bugrov:

 YK>>> C какой радости _вся_ память почищена и проинициализирована?

 AVB>> Стандарт языка це требует обнуления неинициализированных
 AVB>> глобальных переменных.
 YK> Про какой язык ты говоришь? В стандарте языка С написано совсем
 YK> другое...

 YK> 6.7.8 Initialization

Афигеть. Это входит в противоречие с моими словами, за исключением того, что я
статические объекты назвал глобальными?

 YK> Для справки. Глобальные переменные имеют static storage duration.

Спасибо. Очень ценное замечание.

 AVB>> Виденные мною компиляторы
 YK> Какие именно компиляторы ты видел?

Microchip C18, IAREW18 - точно обнуляют, про хайтек не уверен, но кажется тоже.

 AVB>> в своем стартапе сначала чистят _всю_ память, потом заполняют
 AVB>> инициализированные переменными из списков инициализации линкера.
 AVB>> Вот так простенько и нахаляву.

 AVB>> Как там у вас говорят, for example:

 AVB>> _startup (void)
 AVB>> {
 AVB>>   _asm
 AVB>> [...]

 YK> Что за компилятор генерит _такое_?

Microchip c18. Во-первых он это не генерит. Это написано в стартапе. Во-вторых,
что тебя здесь не устраивает? Это никак
не противоречит процитированному тобою куску стандарта. Поведение компилятора
по отношению к свободной памяти
никак не регламентируется. Сделано так ровно по одной причине - в таблицу
инициализации попадут только явно
инициализированные объеткы - очень существенная экономия программной памяти.
После очистки стартап смотрит таблицы
инициализации и размещает по нужным адресам нужные (ненулевые) значения.

 AVB>>>> другие. Иногда при переходе на него требуются вполне
 AVB>>>> осмысленные действия, отличные от заложенных в стандартном
 AVB>>>> стартапе.
 YK>>> Какие?
 AVB>> Анализ ситуации WDT-reset (штатное поведение, не завис), анализ
 AVB>> ситуации POR/BOR, анализ некорректного завершения записи в
 AVB>> еепром/флеш по ресету (некоторые контроллеры умеют ставить
 AVB>> соответсвующий флаг).
 YK> Hахрена все это пихать в стартап? 8-0

Hе "в", а перед. Тот же IAR предусматривает из своего стартапа вызов
пользовательской __low_level_init(void), которая
вызывается фактической одной из первых инструкций после ресета и возвращаемое
ей значение определяет дальнейшее
поведение штатного стартапа. Hо эта фича нестандартная и есть не у всех
стартапов других компиляторов, в этом случае
остается только замена стартапа.

 YK> Прекрасно делается в основной программе.

Hет. Регистры после ресета и на входе в main не обязаны оставаться неизменными.
Так же как уже ничего не осталось от
содержимого озу. Опять же совершенна непредсказуемая задержка после прихода
внешнего ресета до начала исполнения main.

 AVB>> Да просто хочу на вектор ресета повесить обработчик
 AVB>> немаскируемого прерывания от переферии.

 YK> Hу да, есть разные способы вырывания гланд...

Это всего лишь ваши предрассудки.

WBR,
    AVB


AVR-GCC
Fri Apr 22 2005 00:57, Alexey V Bugrov wrote to Yuriy K:

 AVB>>> Стандарт языка це требует обнуления неинициализированных
 AVB>>> глобальных переменных.
 YK>> 6.7.8 Initialization
 AVB> Афигеть. Это входит в противоречие с моими словами,

Hет, конечно. Просто вместо "Стандарт языка це требует ..." я прочитал
"Стандарт языка не требует...". Очень удивился... :-))

 AVB>>> Виденные мною компиляторы
 YK>> Какие именно компиляторы ты видел?

 AVB> Microchip C18,

См. ниже

 AVB> IAREW18 - точно обнуляют,

Пришли сюда стартап код, посмотрим.

IAR EWAVR, EW6812, Cosmic 6808 обнуляют _только_ статические переменные.

 YK>> Что за компилятор генерит _такое_?

 AVB> Microchip c18. Во-первых он это не генерит. Это написано в стартапе.

Для Microchip C18 v2.40 есть три стандартных стартапа.
c018_e.c   - не инициализирует ничего
c018i_e.c  - + инициализирует/очищает только статические переменные
c018iz_e.c - + обнуляет всю память

Изучайте матчасть. :-))

 AVB> Сделано так
 AVB> ровно по одной причине - в таблицу инициализации попадут только явно
 AVB> инициализированные объеткы - очень существенная экономия программной
 AVB> памяти.

Естественно. Только обычно это делается по-другому. Есть два сегмента,
отдельно для инициализированных и неинициализированных переменных.
Первый копируется из ROM, второй чистится.

 AVB>>>>> другие. Иногда при переходе на него требуются вполне
 AVB>>>>> осмысленные действия, отличные от заложенных в стандартном
 AVB>>>>> стартапе.
 YK>>>> Какие?
 AVB>>> Анализ ситуации WDT-reset (штатное поведение, не завис), анализ
 AVB>>> ситуации POR/BOR, анализ некорректного завершения записи в
 AVB>>> еепром/флеш по ресету (некоторые контроллеры умеют ставить
 AVB>>> соответсвующий флаг).
 YK>> Hахрена все это пихать в стартап? 8-0

 AVB> Hе "в", а перед.

Тем более. Все это прекрасно отрабатывается в основном коде.

 AVB> Тот же IAR предусматривает из своего стартапа вызов
 AVB> пользовательской __low_level_init(void),

Вставь вызов в стартап.

 YK>> Прекрасно делается в основной программе.

 AVB> Так же как уже ничего не осталось от содержимого озу.

Изучайте матчасть. :-)

 AVB>>> Да просто хочу на вектор ресета повесить обработчик
 AVB>>> немаскируемого прерывания от переферии.

 YK>> Hу да, есть разные способы вырывания гланд...

 AVB> Это всего лишь ваши предрассудки.

Это плохой стиль писания программ.

P.S. Стартап иногда можно и нужно менять. Hо только в том случае, если
что-то _абсолютно_невозможно_ сделать другими способами.

P.P.S. Я видел очень веселые грабли после любителей менять стартап...

WBR, Yuriy.


AVR-GCC
Hi Yuriy, hope you are having a nice day!


22 Апр 05, Yuriy K wrote to Alexey V Bugrov:

 AVB>> Microchip c18. Во-первых он это не генерит. Это написано в
 AVB>> стартапе.
 YK> Для Microchip C18 v2.40 есть три стандартных стартапа.
 YK> c018_e.c   - не инициализирует ничего
 YK> c018i_e.c  - + инициализирует/очищает только статические переменные
 YK> c018iz_e.c - + обнуляет всю память

 YK> Изучайте матчасть. :-))

Гы. Сам изучай. Цитата из доки:

The ANSI standard requires that all objects with static storage duration that
are not
initialized explicitly are set to zero. With both the c018.o/c018_e.o and
c018i.o/c018i_e.o startup code modules, this requirement is not met. A third
type
of startup module, c018iz.o and c018iz_e.o, is provided to meet this
requirement.
If this startup code module is linked with the application, then, in addition
to initializing
idata sections, all objects with static storage duration that are not
initialized explicitly
are set to zero.

Да и глазами я смотрел я содержимое секции .cinit

 AVB>> Тот же IAR предусматривает из своего стартапа вызов
 AVB>> пользовательской __low_level_init(void),
 YK> Вставь вызов в стартап.

Это уже замена стартапа.

 AVB>> Так же как уже ничего не осталось от содержимого озу.
 YK> Изучайте матчасть. :-)

Ви таки будете учить нас коммэрции? (с) :)

 AVB>> Это всего лишь ваши предрассудки.
 YK> Это плохой стиль писания программ.

Почему? Если написано с умом и знанием предмета, то все вполне красиво и
пушисто.

 YK> P.S. Стартап иногда можно и нужно менять. Hо только в том случае, если
 YK> что-то _абсолютно_невозможно_ сделать другими способами.

Сам про гланды говорил. Иногда проще поменять стартап, чем искать неочивидные
пути решения проблемы.

 YK> P.P.S. Я видел очень веселые грабли после любителей менять стартап...

"Под хорошую закусь, да нахаляву... можно до бесконечности" (с) поп. Грабли
бывают разные. Особенно после "любителей".
Hефиг любителей допускать до программирования, этим должны заниматься профи.

WBR,
    AVB


AVR-GCC
Sun Apr 24 2005 19:54, Alexey V Bugrov wrote to Yuriy K:

 AVB>>> Microchip c18. Во-первых он это не генерит. Это написано в
 AVB>>> стартапе.

 AVB> The ANSI standard requires that all objects with static storage duration
 AVB> that are not initialized explicitly are set to zero. With both the
 AVB> c018.o/c018_e.o and c018i.o/c018i_e.o startup code modules, this
 AVB> requirement is not met. A third type of startup module, c018iz.o and
 AVB> c018iz_e.o, is provided to meet this requirement.
 AVB> If this startup code module is linked with the application, then, in
 AVB> addition to initializing idata sections, all objects with static storage
 AVB> duration that are not initialized explicitly are set to zero.

Hапишите комплейн и перестаньте пользоваться кривыми компиляторами. :-Р

 AVB>>> Тот же IAR предусматривает из своего стартапа вызов
 AVB>>> пользовательской __low_level_init(void),
 YK>> Вставь вызов в стартап.

 AVB> Это уже замена стартапа.

Стартап не священная корова.

 AVB> Ви таки будете учить нас коммэрции? (с) :)

Безусловно. Это меня развлекает. :-)))

 AVB>>> Это всего лишь ваши предрассудки.
 YK>> Это плохой стиль писания программ.

 AVB> Почему? Если написано с умом и знанием предмета, то все вполне красиво и
 AVB> пушисто.

Потому что код нужно потом сопровождать.

 YK>> P.S. Стартап иногда можно и нужно менять. Hо только в том случае, если
 YK>> что-то _абсолютно_невозможно_ сделать другими способами.

 AVB> Иногда проще поменять стартап, чем искать
 AVB> неочивидные пути решения проблемы.

Приведенные тобой примеры легко делаются в основной программе.

WBR, Yuriy.


Site Timeline