Перейти к содержанию
    

spongebob

Участник
  • Постов

    138
  • Зарегистрирован

  • Посещение

Весь контент spongebob


  1. По поводу вызова библиотечного стартап-кода. Как я понимаю, все что содержится в секциях .initN до вызова main() - это и есть стартап? :) Т. е., он "размазывается" по секциям .init0 ... .init9 с дальнейшей возможностью коррекции каждой из секций программистом (часть секций менять нельзя, как я понял)? Кстати, когда мы объявляем функцию способом типа void my_init_portb (void) __attribute__ ((naked)) __attribute__ ((section (".init3"))); то это замещает все что было помещено стартапом в эти секции? А если несколько аналогичных выше указанным объявлениям, то все что объявлено разместится в секции .init3? Понятно, достаточно удобная вещь получается, если писать на Си++ :) Кстати, можете сказать что-нибудь по поводу избыточности/неизбыточности Си++ по отношению к Си и насколько оптимальным получается код для AVR, ARM?
  2. Вопросы по секциям. Читаю http://www.nongnu.org/avr-libc/user-manual, но там как-то очень скупо все описано... прошу помочь разобраться. Записи -Wl,--section-start=.data=0x802000 и -Wl,--section-start,.data=0x802000 эквивалентны? Т. е., синтаксис указания начала расположения секций имеет несколько вариантов? Как на самом деле выглядят секции .data, .bss, .noinit? Как я понимаю, данные из .data копируются в определенный момент времени в ОЗУ, инициализируя переменные. Когда копируются и кем? Нашел нечто в описании секции .init4, но там сказано про контроллеры с ОЗУ > 64 кБ ПЗУ (а это почему?). Для секции .bss аналогичной операцией является заполнение нулями. Когда? А для чего нужна секция .noinit? Ведь есть же .data и .bss. Правильно ли я понимаю, что все глобальные или статические переменные, которые инициализированы программистом попадают в .data, а неинициализированные глобальные и статические переменные попадают в .bss и инициализируются нулями (по стандарту Си)? А что происходит с локальными инициализированными переменными? Они же создаются на стеке, кто их и когда инициализирует? Зачем нужны .finiN, если мы в main() обычно делаем while(1) {};?
  3. Стэк в scmRTOS

    Ну, получается и не прожорливый совсем... мельком погуглил - жалуются на прожорливость. Да, вопрос про avr-libc :) Кстати, в WinAVR есть эти исходники (сейчас нет под рукой посмотреть, к сожалению)? Наверное, в avr-libc sprintf жутко оптимизированный под AVRы? :)
  4. Стэк в scmRTOS

    Кстати, насколько прожорлив sprintf? Сколько он потребляет стека? Использует ли он кучу?
  5. Стэк в scmRTOS

    Принцип понятен, спасибо большое за рекомендации. Но как же мнение о том, что динамическая память для AVR - это слишком ресурсоемко и не выгодно? Кстати, в WinAVR уже есть менеджер кучи и чем он отличается от выше Вами указанного?
  6. Стэк в scmRTOS

    А, ну это да, можно... Т. е., заводим большой массив (глобальный статический), который, к примеру, может вместить в себя 10 команд (размер данных каждой команды = размеру данных максимальной команды). Доступ к массиву между процессами разделяем с помощью мьютекса. Процесс 1 помещает команду в массив, указатель на команду в массиве помещает в очередь команд (она теперь маленькая по объему). Процесс 2 извлекает из очереди указатель на команду и по нему получает доступ к данным команды. Так? Но тогда придется как-то учитывать процессу 1, что в массиве по определенным адресам уже есть команды, чтобы не затереть ничего.
  7. Стэк в scmRTOS

    Фактически дело обстоит так. Имеется очередь (OS::channel) из элементов структур (в структуре массив 250 байт + еще несколько переменных). Один процесс кладет в очередь данные (команды) когда нужно, другой процесс - извлекает их и обрабатывает. Очередь нужна, чтобы "копить" команды, т. к., команды могут выполняться достаточно долго, а терять их очень нежелательно. Ну и чтобы поместить элемент в очередь (push) и извлечь его оттуда (pop) приходится заводить временный элемент (тип и размер - выше), который и отжирает стек. Сама очередь - глобальная. Ну, может, архитектура не совсем нормальная... посоветуйте, пожалуйста, как лучше :) Да, с массивом работает одна задача. Но их как минимум два :) Принцип действия следующий. Процесс 1 (главный, дает команды): команда -> функция подготовки команды и помещения ее в очередь (помещает данные в свой локальный буфер 1, а из него в очередь) -> очередь. Процесс 2 (подчиненный выполняет команды): функция извлечения команды из очереди в буфер 2 и обработки команды. Команды занимают приличный объем и имеют разный размер. Буферы 1 и 2 - одного типа, под все команды (универсальные). Проблема в том как поместить в очередь команду, не используя для этого промежуточный буфер 1. Вот так вот изначально было сделано... фактически во внутренних 8 кБ остался только стек main(). Кстати, возвращаясь к вопросу об устройстве стеков при использовании ОС. После старта ОС стек main() не используется (планировщик при передаче управления заносит в указатель стека адрес стека требуемого процесса, который может быть расположен где угодно)? А почему стек main() использовать тяжело? Спасибо, почитаем. Как я понял, надо осваивать скриптописание для линкера? :) В двух словах, создаем специальные секции, в которые по необходимости переносим некоторые переменные, а эти секции линкуются куда надо (в данном случае во внешнюю память)? Очень интересно :) Спасибо, почитаем, главное - понять что там написано :) Пока линкерные скрипты для меня страшны :(
  8. Стэк в scmRTOS

    Ну как большие... около 300 байт. Несколько их (по одному в каждой вложенной функции), функций несколько... вот и набегает. Фактически, большая часть из этих массивов - временные, нужны иногда, поэтому было принято решение делать их локальными, чтобы они создавались на стеке (типа, память сэкономить). По поводу размещения... тут я совсем слаб... Делаем большие массивы глобальными и с помощью ключей компилятора (линкера) перемещаем секции data, bss во внешнюю память (-Wl,--section-start,.data=0x802200)? А как тогда разместить стеки процессов во внутреннем ОЗУ? Если процессов много, то хватит ли им 8 кБ внутреннего ОЗУ? :)
  9. Стэк в scmRTOS

    Ага, к 8 кБ на кристалле еще 32 кБ снаружи. Вы хотите сказать, что стек программы после запуска ОС не используется? :) Кстати, мы ведь ради интереса можем взять адрес какой-нибудь локальной переменной, принадлежащей процессу. По адресу будет видно где она лежит... Об этом я знаю... я спрашивал как связан стек программы со стеками процессов... стеки процессов конечно не зависят друг от друга... GCC. Очень интересный вопрос, но для того, чтобы на резет попадало вотчдога не всегда нужно, нужен просто баг хороший ;)
  10. Стэк в scmRTOS

    В процессе вызываются функции обработки данных, в которых используются локальные крупные массивы. На самом деле памяти меньше съедается, я просто хочу понять принцип :) Например, что произойдет, если я объявлю размер стека в процессе 10 кБ, а стек программы, как писалось выше, будет иметь размер не более 8 кБ? Может и ни при чем... Сторожевого таймера нет.
  11. Стэк в scmRTOS

    Всем привет! Поясните, пожалуйста, есть ли какая-нибудь взаимосвязь между стеком программы и стеками процессов в ОС? И между их размерами... Что конкретно хранится в стеках процессов? Допустим, правильно ли следующее. В системе два процесса (П1 и П2). П1 завершает работу. Планировщик копирует содержимое стека программы в стек П1, а содержимое стека П2 в стек программы и передает управление П2. П2 работает, потом завершает работу. Планировщик копирует содержимое стека программы в стек П2, а содержимое стека П1 в стек программы и передает управление П1. Далее все повторяется по кругу... Стеки процессов не должны превышать размеры стека программы. Допустим, если в mega1280 во внутренней памяти размещается только стек программы, то стеки каждого из процессов не должны превышать 8192 байт. Бьюсь который день со спонтанной перезагрузкой, никак баг поймать не могу :(
  12. Фигня какая-то... поставил 2010 WinAVR, он тоже опции -fstack-usage не знает :( Объясните, пожалуйста, я, может, не понимаю чего? :) Может, для AVRов это не работает?
  13. Касательно вот этого еще вопросы есть: http://www.nongnu.org/avr-libc/user-manual/malloc.html Динамическая память не нужна (куча). На плате установлена внешняя ОЗУ (32 кБ). Ее хотелось бы использовать по-максимуму :) Если не указывать линкеру __heap_end и __heap_star, он под кучу память выделит или нет? Если все-таки выделит, то куда поместит? Сразу за bss? Стек, как я понимаю, всегда лучше размещать во внутренней памяти (скорость выше). Ну а как разместить стек во внешней памяти? Кстати, в какой секции лучше разместить инициализацию внешней памяти (включение и конфигурирование)? В третьей?
  14. Вот еще интересная ссылочка: http://www.avrfreaks.net/index.php?name=PN...pic&t=52249
  15. Не понимает такой опции :( Может, староват компилер?
  16. Вот спасибо, попробуем :) Это ключ компилятора или линкера? Что значит "все локальные переменные имеют статический размер"? Объявлены как "static" внутри функции или это просто не динамически выделяемая память (из кучи)? Иными словами, если мы не используем динамическую память (кучу), то компилятор с выше озвученным флагом покажет нам сколько от стека отъедает каждая функция? По поводу "bounded" не понял. Тут будут выдаваться предупреждения, если функция использует стека больше, чем сколько?
  17. Всем привет! Подскажите, пожалуйста, каков механизм вызова функций в Си++? Имеет ряд вложенных функций (работа с массивами), хочется посчитать какой максимальный объем памяти в стеке они потребуют (передача параметров + сами данные в функциях). Можно как-нибудь "автоматизировать" процесс подсчета? Видимо, читать значение указателя стека в определенные моменты времени? Все ли локальные переменные, объявляемые в функциях, создаются в стеке?
  18. Так чтоли? :) А откуда дребезг, если коммутируем транзистором? Ну, как я понимаю, кнопка должна быть типа "сухой контакт" и один ее контакт должен быть подтянут к питанию, другой - к общей цепи внутри устройства?
  19. Всем привет! Как можно электронным способом "нажать" на обычную тактовую кнопку (закоротить ее контакты)? Реле не подходит - слишком габаритно.
  20. TL431

    Компаратор + ИОН. ПОС на компараторе - 5 МОм. ИОН на инвертирующий вход. Ничего не оборвано. Но земля плохая. Уточнил, реально, плата - макетная, питание к ней - по длинным проводам. Тот самый пик-ту-пик 100 мВ и на замле есть, причем зависит от расположения проводов и от того трогаешь их или нет и т. п. В общем ТЛ431 тут не виновата :)
  21. TL431

    Кстати, присмотрелся еще раз. На синус уже не похоже... больше на шумы похоже. Пик-ту-пик - 80 мВ. Резистор не помогает...
  22. TL431

    На входе +5 В. Резистор балластный 330 Ом. TL431AC от ST.
  23. TL431

    Да, точно, слова перепутал :) Нету кондеров никаких! Я ставил для эксперимента разные... только хуже становится... Кстати, может, от нагрузки зависит? У меня в качестве нагрузки - вход ОУ. Вообще, это возбуждение пугает, конечно, ТЛка у меня в качестве опорного ведь... Ага, только там слов мало - одни картинки :) Погляжу.
  24. TL431

    Все привет! Есть несколько вопросов. 1. В TL431 ОУ или компаратор? 2. Из-за чего возникает шум на выходе TL431 (катод соединен с опорным входом, баластный резистор до 2 кОм)? Шум в виде синуса амплитудой порядка 50 мВ. Как его убрать? Кондеры на выходе не помогают...
  25. Согласен. Но, как я понимаю, далеко не всегда ставят подобные МС - чаще всего ставят именно предохранители. И, недоставабельная она какая-то :(
×
×
  • Создать...