Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: startup asm
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2, 3
aaarrr
Цитата(zltigo @ Jan 22 2009, 23:34) *
Перечитайте, если это все еще кажется Вам несущественным, то это Ваши проблемы.

3 раза перечитал. Никакой конкретики, кроме "стек сожрет" да "printf вызовет" от Вас слышно не было, а это, извините, бред и домыслы.

У меня, например, процедура, вызываемая из abort'а или выбрасывает диагностику в консоль и виснет, или пишет ее в память для последующего помещения в лог и рестартует процессор, в зависимости от настроек проекта debug/release.

Цитата(zltigo @ Jan 22 2009, 23:34) *
Приведннные цитаты мне? Я то знаю, по этой причине и спросил. А что там в сишной функции-то "для исправления"-то сделаете и куда попадете возвращению без разбору по типу аборта на -4?  

Тогда обратите внимание на этот пост, и не пытайтесь приписать мне чужие ошибки.
zltigo
Цитата(aaarrr @ Jan 22 2009, 22:47) *
У меня, например, процедура, вызываемая из abort'а или выбрасывает диагностику в консоль



Ну а чего это Вы 'не заметили' замечания на счет того, что периферия может быть в общем случае находится в произвольном состоянии? А если консоль не UARTа USB? А с Ethernet поработать? 

Цитата
и виснет, или пишет ее в память для последующего помещения в лог и рестартует процессор, в зависимости от настроек проекта debug/release.


Отлично. Теперь почему-бы все эти 'суперфункции' просто не реализовать несколькими командами там-же в ASM? 

Цитата
Тогда обратите внимание на этот пост, и не пытайтесь приписать мне чужие ошибки.

Я обсуждаю представленный в текущей теме код. Ваши комментарии действительно не заметил sad.gif. Однако вопрос том, что в сишной функции было сделано для того, что-бы реально мог быть осуществлен остался без ответа, а сама функция по крайней мере в Вашей реализации
- без возврата, как и у меня.
- практически ничего не делающая, ну кроме попытки в UART выплюнуть сообщение.
Так о чем спор? О том, что я выдаю/сохраняя сообщения просто НОРМАЛЬНО ШТАТНО подняв систему после рестарта по интерфейсам любой сложности а не в экстремальных условиях и только в UART.
aaarrr
Цитата(zltigo @ Jan 23 2009, 00:30) *
Ну а чего это Вы 'не заметили' замечания на счет того, что периферия может быть в общем случае находится в произвольном состоянии?

Может быть, хотя вероятность почти нулевая. Проинициализировать UART для лобового вывода - дело нескольких команд.

Цитата(zltigo @ Jan 23 2009, 00:30) *
А если у консоль не UARTа USB? А с Ethernet поработать?

Да пожалуйста. В "представленном в текущей теме" коде пока и UART не упоминался. Вариантов масса, на каждый из них нужно свое решение, и это решение спокойно надстраивается над handler'ом.

Цитата(zltigo @ Jan 23 2009, 00:30) *
Отлично. Теперь почему-бы все эти 'суперфункции' просто не реализовать несколькими командами там-же в ASM? 

А почему бы все-таки не на C, а? У меня вот несколько платформ, asm-handler'ы для всех одинаковые, а надстройки меняются - очень удобно.

Цитата(zltigo @ Jan 23 2009, 00:30) *
Однако вопрос том, что в сишной функции было сделано для того, что-бы реально мог быть осуществлен остался без ответа

Кто осуществлен?

Цитата(zltigo @ Jan 23 2009, 00:30) *
Так о чем спор? О том, что я выдаю/сохраняя сообщения просто НОРМАЛЬНО ШТАТНО подняв систему по все доступным интерфейсам а не в экстремальных условиях и только в UART.

Если Вы не заметили, именно это (НОРМАЛЬНО ШТАТНО пишу в лог) я и делаю в "боевой" версии ПО.
zltigo
Цитата(aaarrr @ Jan 22 2009, 23:48) *
Если Вы не заметили, именно это (НОРМАЛЬНО ШТАТНО пишу в лог) я и делаю в "боевой" версии ПО.

Заметил и по этому вообще не понимаю к чему было все это закусывание удил sad.gif? В чем цимус разделения на "боевые" и прочие? У меня вообще-то обработчики абортов и минимальные консоли вообще практически всегда принадлежность загрузчика и какие версии боевые али не очень вылетают на аборт без разницы.
aaarrr
Цитата(zltigo @ Jan 23 2009, 00:51) *
В чем цимус разделения на "боевые" и прочие?

По мне так удобнее. Всяческая диагностика может мешать нормальному исполнению программы, поэтому ее проще включать/выключать одним дефайном. Хотя это скорее в случае достаточно жесткого реалтайма.
zltigo
Цитата(aaarrr @ Jan 23 2009, 00:14) *
Всяческая диагностика может мешать нормальному исполнению программы, поэтому ее проще включать/выключать одним дефайном.


Чем наличие любого из вариантов обработчика абортов может мешать "нормальному исполнению программы" ? Зачем отключать, включать, иметь разные....
aaarrr
Цитата(zltigo @ Jan 23 2009, 01:18) *
Зачем отключать, включать, иметь разные....

Да нравится мне просто так. В отладочном варианте случился аборт->выдали диагностику->зависли. Смотрим, что там в консольке вывалилось, что на светодиодах в устройстве осталось.
zltigo
Цитата(aaarrr @ Jan 23 2009, 00:23) *
В отладочном варианте случился аборт->выдали диагностику->зависли. Смотрим, что там в консольке вывалилось, что на светодиодах в устройстве осталось.

В любом варианте вываливается в аборт, если при этом обраруживается подключенный терминал, то в консоле и остается. Если терминал не подключен, то другие варианты сохранения и перезагрузка. При подключенном терминале поведение при вылете на аборт можно с него-же и изменить. Конфигурация системы обычно тоже есть.
sergey sva
Проверти пожалуйста, код startap файла.
Нажмите для просмотра прикрепленного файла
zltigo
Кроме упражнений в copy-paste c абсолютно ненужной, точнее вредной ASM обертки более просто ничего нет sad.gif. Дурдом sad.gif



 
aaarrr
Как-то разлаписто, я бы сказал sad.gif
Зачем сразу полностью инициализировать AIC и прописывать все возможные обработчики прерываний? Понадобилось какому-нибудь модулю прерывание - в модуле инициализировали AIC, добавили (если нужно, конечно) wrapper и т.д.

Цитата(zltigo @ Jan 23 2009, 18:33) *
Кроме упражнений в copy-paste c абсолютно ненужной, точнее вредной ASM обертки более просто ничего нет sad.gif

Asm-обертка уж точно не вредная, хотя нужна, конечно, далеко не всегда, это верно.
zltigo
Цитата(aaarrr @ Jan 23 2009, 17:38) *
Asm-обертка уж точно не вредная, хотя нужна, конечно, далеко не всегда, это верно.

Ненужные вещи вредны.
sergey sva
>Зачем сразу полностью инициализировать AIC и прописывать все возможные обработчики прерываний?
Сразу все не будет инициализироваться только то где будет стоять единица,все остальное препроцессор выбросит.
.equ IRQ_SYS_ON, 0 @ 1 инициализировать 0 нет
aaarrr
Цитата(zltigo @ Jan 23 2009, 18:42) *
Ненужные вещи вредны.

Вложенные прерывания бывают нужны. Да, далеко не всегда, но бывают. Называть код вредным только потому, что он в каком-то случае не нужен, не стоит.
Но в стартапе ему, конечно, делать совершенно нечего, согласен.

Цитата(sergey sva @ Jan 23 2009, 18:46) *
Сразу все не будет инициализироваться только то где будет стоять единица,все остальное препроцессор выбросит.
.equ IRQ_SYS_ON, 0 @ 1 инициализировать 0 нет

У Вас все прерывания будут вложенными? Сильно сомневаюсь.
Скорее всего, вообще будут задействованы 2-5 шт. Так зачем было все это писать?
sergey sva
>У Вас все прерывания будут вложенными? Сильно сомневаюсь.
>Скорее всего, вообще будут задействованы 2-5 шт. Так зачем было все это писать?
чтобы немного с ассемблером разобраться, Да и вдруг еще кому он пригодится(мало ли где и какие и когда прерывания понадобятся а здесь вкл и все),
aaarrr
Цитата(sergey sva @ Jan 23 2009, 18:57) *
чтобы немного с ассемблером разобраться,

Copy-paste - не лучший метод написания программы даже тогда, когда со всем разобрались.
Для освоения просто вредный.

Цитата(sergey sva @ Jan 23 2009, 18:57) *
Да и вдруг еще кому он пригодится(мало ли где и какие и когда прерывания понадобятся а здесь вкл и все),

А если понадобятся не вложенные прерывания (как чаще всего и бывает) - что делать будете?
sergey sva
>А если понадобятся не вложенные прерывания (как чаще всего и бывает) - что делать будете?
Можно закоментировать не нужное, первые и последние строчки в обработчике, нужны в любом случае.
А вообще будет зависть от задачи, сейчас нет не какой задачи, Кризис одним словом, нас отпустили
до 2 марта отдыхать, вот и занимаюсь самообучением smile.gif
aaarrr
Цитата(sergey sva @ Jan 23 2009, 19:18) *
>А если понадобятся не вложенные прерывания (как чаще всего и бывает) - что делать будете?
Можно закоментировать не нужное, первые и последние строчки в обработчике, нужны в любом случае.

В случае не вложенных прерываний обертка не нужна вообще.
sergey sva
> не нужна вообще
Если использовать стандартное оформление void handler(void) __attribute__ ((interrupt ("IRQ")));
А если оставить этот же стартап но использовать вот такой код в обработчике?
Код
    sub   r14,       r14, #0x04            
    stmfd sp!,      {r0-r3,r14}          
    bl       irq_handler                  
   ldmfd  sp!,      {r0-r3,pc}^
zltigo
Цитата(aaarrr @ Jan 23 2009, 18:20) *
В случае не вложенных прерываний обертка не нужна вообще.


Да и сами вложенные прерывания почти ненужная вещь. Делал за всю жизнь ровно два раза. Один раз по причине того, что система базировалась на 80286 + MSDOS и возможности других реализаций были ограничены. Но в этом случае все делалось посерьезнее, например были собственный, а не наследуемые стековые фреймы. Второй раз, когда за два дня делалась примитивная штучка и лобовое решение являлось вполне приемлимым. Для ARM7 с его штатными IRQ и FIQ смысл организации вложеных прерываний практически свидетельствует о банальном бездумом подходе к делу.       






Цитата(sergey sva @ Jan 23 2009, 18:41) *
А если оставить этот же стартап но использовать вот такой код в обработчике?


Для чего, блин......
aaarrr
Цитата(sergey sva @ Jan 23 2009, 19:41) *
А если оставить этот же стартап но использовать вот такой код в обработчике?

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

Цитата(zltigo @ Jan 23 2009, 19:44) *
Для ARM7 с его штатными IRQ и FIQ смысл организации вложеных прерываний практически свидетельствует о банальном бездумом подходе к делу.

Иногда нужно иметь несколько прерываний с максимальным приоритетом, одним FIQ в таком случае не обойдешься.
sergey sva
Цитата
Для ARM7 с его штатными IRQ и FIQ смысл организации вложеных прерываний практически свидетельствует о банальном бездумом подходе к делу


а что плохого в вложеных прерываниях для ARM7?
aaarrr
Цитата(sergey sva @ Jan 23 2009, 19:51) *
а что плохого в вложеных прерываниях для ARM7?

То, что как было уже неоднократно замечено, нужны они далеко не всегда.
zltigo
Цитата(aaarrr @ Jan 23 2009, 18:51) *
Иногда нужно иметь несколько прерываний с максимальным приоритетом, одним FIQ в таком случае не обойдешься.

Какие проблемы иметь несколько прерываний на FIQ? Будет, естесвенно, несколько тактов лишних потрачено на это, но эти затраты не сравнимы с неумными софтовыми организациями вложенности. 
aaarrr
Цитата(zltigo @ Jan 23 2009, 19:58) *
Какие проблемы иметь несколько прерываний на FIQ? Будет, естесвенно, несколько тактов лишних потрачено на это, но эти затраты не сравнимы с неумными софтовыми организациями вложенности.

Затраты как раз сравнимы - те же несколько тактов.
zltigo
Цитата(aaarrr @ Jan 23 2009, 19:05) *
Затраты как раз сравнимы - те же несколько тактов.


Это вариант "несколько FIQ"  


Код
ldr     pc,[pc,#-0xF20]


То, что написано в качестве обертки для организации вложенности, полагаю, Вы еще помните? Или освежить? Сколько там тактов!?
singlskv
Цитата(zltigo @ Jan 23 2009, 19:44) *
Да и сами вложенные прерывания почти ненужная вещь. Делал за всю жизнь ровно два раза. Для ARM7 с его штатными IRQ и FIQ смысл организации вложеных прерываний практически свидетельствует о банальном бездумом подходе к делу.       
+1
Не нужны почти никогда вложенные прерывания,
конкретно для арм, FIQ + невложенные IRQ прерывания должно хватать для 99% применений..
тч всякие очень умные обработчики нафиг не нужны... обычно... ИМХО...
aaarrr
Цитата(zltigo @ Jan 23 2009, 20:26) *
Это вариант "несколько FIQ"  
Код
ldr     pc,[pc,#-0xF20]

Спешу огорчить: работать не будет. Придется еще ручками источник найти. Сколько это тактов?

Цитата(singlskv @ Jan 23 2009, 21:39) *
конкретно для арм, FIQ + невложенные IRQ прерывания должно хватать для 99% применений..

Ну, мне приходилось встречаться и с этим 1%. Хотя пару раз всего.
zltigo
Цитата(aaarrr @ Jan 23 2009, 21:00) *
Спешу огорчить: работать не будет. Придется еще ручками источник найти. Сколько это тактов?



Ну вообще-то это Ваш код для Атмел из поста #53 дежавью? А что, у атмеловские AIC настолько примитивны, что вектор для FIQ не хранят? Ну пусть не одна, так несколько команд - считать источник, test и прыгнуть. По любому и близко к затратам сохранение/воссановление контекста не лежит.
aaarrr
Цитата(zltigo @ Jan 23 2009, 22:21) *
А что, у атмеловские AIC настолько примитивны, что вектор для FIQ не хранят?

Хранят, но читается из него всегда одно значение, увы sad.gif
Да и на столь любимых Вами LPC с их PL190/192 векторизация FIQ как-то не предусмотрена - вот же примитив smile.gif

Цитата(zltigo @ Jan 23 2009, 22:21) *
Ну пусть не одна, так несколько команд - считать источник, test и прыгнуть. По любому и близко к затратам сохранение/воссановление контекста не лежит.

Не нужно демонизировать затраты. С выключенными прерываниями нужно выполнить всего-то пяток команд:
Код
        sub      r14, r14, #0x04
        stmfd    sp!, {r14}
        mrs      r14, SPSR
        stmfd    sp!, {r0, r14}
        msr      CPSR_c, #ARM_MODE_SYS

А уж от сохранения/восстановления контекста в любом случае никуда не деться, тут Вы хватили.
zltigo
Цитата(aaarrr @ Jan 23 2009, 21:33) *
А уж от сохранения/восстановления контекста в любом случае никуда не деться, тут Вы хватили.


Вопрос в размере контекста и степени бездумности его сохранения.


Цитата
Да и на столь любимых Вами LPC с их PL190/192 векторизация FIQ как-то не предусмотрена - вот же примитив


Я в курсе LPC smile.gif и почему FIQ это FIQ. Напомню, что отцитированый код - Ваш, а не мой.
aaarrr
Цитата(zltigo @ Jan 23 2009, 23:38) *
Вопрос в размере контекста и степени бездумности его сохранения.

SPSR, LR - не так уж много.

Цитата(zltigo @ Jan 23 2009, 23:38) *
Напомню, что отцитированый код с попыткой изобразить обработку векторизации FIQ для Aтмел и к тому-же с чтением какого-то другого порта - Ваш, а не мой.

Опять включили воображение некстати? Попытка изобразить обработку векторизации - звучит-то как!

Готов выслушать замечания и по такому фрагменту:
Код
    nop

Уверен, они у Вас найдутся wink.gif
sergey sva
Принялся за скрипт для линковщика, посмотрел примеры от атмела для Using Open Source Tools for AT91SAM7S Cross Development revision
Хочу попробовать его с этим стартапом. Такой вопрос: после того как будет сгенерирован бинарник, его можно просмотреть,
может программа есть специальная, имею ввиду адреса как он там все распределил ?
Если не затруднит, что еще нужно добавить что бы использовать с этим стартапам ?
CODE

OUTPUT_FORMAT("elf32-littlearm") /* формат памяти. прямой порядок байт (Little-endian). */
OUTPUT_ARCH(arm) /* архитектура АРМ */

ENTRY(_vec_reset) /* вектор сброса */

/* Память микроконтроллера AT91SAM7S256 */
MEMORY
{
flash : ORIGIN = 0x00100000, LENGTH = 256K /* FLASH EPROM */
ram : ORIGIN = 0x00200000, LENGTH = 64K /* static RAM area */
}

_stack_end = 0x0020FA00; /* конец стека (верх стека) */


SECTIONS /* начало секции */
{
. = 0;

.text :
{
*(.text) /* поместить сектор текст в флэш */
} >flash /*TEXT располажение flash */

.data :
{
*(.data) /* поместить сектор дата в рам */
} >ram /*DATA располажение в рам */

.bss :
{


} >ram /*BSS располажение в рам */


} /* конец секции */



zltigo
Цитата(aaarrr @ Jan 23 2009, 23:09) *
SPSR, LR - не так уж много.



И переключение режимов.. Короче, это по минимуму 8 команд. 

Цитата
Готов выслушать замечания и по такому фрагменту:
Код
    nop

Уверен, они у Вас найдутся wink.gif


Мои замечия относились во к этому Вашему коду:


Цитата
  ldr pc, RESET_ADDR
  ldr pc, UNDEF_ADDR
  ldr pc, SWI_ADDR
  ldr pc, PREFETCH_ABORT_ADDR
  ldr pc, DATA_ABORT_ADDR
  .word 0
  ldr pc,[pc,#-0xF20];
  ldr pc,[pc,#-0xF20];  


Вы действительно считаете, что я придираюсь и мне следовало промолчать?
aaarrr
Цитата(zltigo @ Jan 24 2009, 00:34) *
Вы действительно считаете, что я придираюсь и мне следовало промолчать?

Да, я так считаю. Не можете молчать - ознакомьтесь сначала с проблемой, а не трактуйте действие команды исходя из ее "похожести" на соседнюю.
zltigo
Цитата(aaarrr @ Jan 23 2009, 23:58) *
Да, я так считаю. Не можете молчать - ознакомьтесь сначала с проблемой,



Проблемы нет, есть просто трата тактов на чтение адреса перехода из медленного переферийного устройчтва, даже если Atmel присобачил такую приблуду.
aaarrr
Цитата(zltigo @ Jan 24 2009, 01:23) *
Проблемы нет, есть просто трата тактов на чтение адреса перехода из медленного переферийного устройчтва, даже если Atmel присобачил такую приблуду.

А какая разница - тратить время на чтение медленного периферийного устройства, или столь же медленной флеш? В обоих случаях задержка будет в 1 такт сравнительно с RAM, что едва ли смертельно и едва ли вообще стоит внимания.
zltigo
Цитата(aaarrr @ Jan 24 2009, 00:26) *
А какая разница - тратить время на чтение медленного периферийного устройства, или столь же медленной флеш?


Ну мне вообще-то приходилось обработчик FIQ и прямо начиная с 0x18 начинать, и прыгать можно недалеко по смещению в теле команды. Интересно, а обращение к периферии за два такта у Atmel где-то документировано?  
P.S.
Это я поддержания разговора smile.gif
aaarrr
Цитата(zltigo @ Jan 24 2009, 01:52) *
Ну мне вообще-то приходилось обработчик FIQ и прямо начиная с 0x18 начинать

Ну это самый правильный вариант для настоящего FIQ.

Цитата(zltigo @ Jan 24 2009, 01:52) *
Интересно, а обращение к периферии за два такта у Atmel где-то документировано?

Только на картинках. Но проверка показывает такой же результат.

Цитата(zltigo @ Jan 24 2009, 01:52) *
Это я поддержания разговора smile.gif

smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.