Цитата(ViKo @ Apr 25 2012, 11:57)

Работа с массивами - дело долгое. От многозадачности мало что останется, пмсм.
Фактически дело обстоит так.
Имеется очередь (OS::channel) из элементов структур (в структуре массив 250 байт + еще несколько переменных).
Один процесс кладет в очередь данные (команды) когда нужно, другой процесс - извлекает их и обрабатывает.
Очередь нужна, чтобы "копить" команды, т. к., команды могут выполняться достаточно долго, а терять их очень нежелательно.
Ну и чтобы поместить элемент в очередь (push) и извлечь его оттуда (pop) приходится заводить временный элемент (тип и размер - выше), который и отжирает стек.
Сама очередь - глобальная.
Ну, может, архитектура не совсем нормальная... посоветуйте, пожалуйста, как лучше

Цитата(AHTOXA @ Apr 25 2012, 12:24)

А в случае топикстартера всё похоже ещё проще - с массивом работает одна задача. Просто массив надо вынести из стека задачи. В этом случае можно и без мутекса.
Да, с массивом работает одна задача. Но их как минимум два

Принцип действия следующий.
Процесс 1 (главный, дает команды): команда -> функция подготовки команды и помещения ее в очередь (помещает данные в свой локальный буфер 1, а из него в очередь) -> очередь.
Процесс 2 (подчиненный выполняет команды): функция извлечения команды из очереди в буфер 2 и обработки команды.
Команды занимают приличный объем и имеют разный размер. Буферы 1 и 2 - одного типа, под все команды (универсальные).
Проблема в том как поместить в очередь команду, не используя для этого промежуточный буфер 1.
Цитата(ReAl @ Apr 25 2012, 11:56)

Не надо так. Не только стеки, все внутренние структуры scmRTOS полетят во внешнюю память. Вообще всё. С соответствующим замедлением. Во внутренней останется только «стек main()», который и использовать-то толком тяжело.
Вот так вот изначально было сделано... фактически во внутренних 8 кБ остался только стек main().
Кстати, возвращаясь к вопросу об устройстве стеков при использовании ОС. После старта ОС стек main() не используется (планировщик при передаче управления заносит в указатель стека адрес стека требуемого процесса, который может быть расположен где угодно)?
А почему стек main() использовать тяжело?
Цитата
Спасибо, почитаем.
Как я понял, надо осваивать скриптописание для линкера?

В двух словах, создаем специальные секции, в которые по необходимости переносим некоторые переменные, а эти секции линкуются куда надо (в данном случае во внешнюю память)?
Цитата(AHTOXA @ Apr 25 2012, 11:44)

В scmRTOS 4.0 появился механизм для вычисления используемого каждым процессом стека (см. пример 4-Debug). Включите его, погоняйте. Узнаете, сколько чего и где. Может быть, всё спокойно влезет во внутреннее ОЗУ.
Очень интересно

Цитата
Почитайте про
линкерные скрипты. Примеры используемых avr-gcc скриптов находятся в lib\ldscripts.
Спасибо, почитаем, главное - понять что там написано

Пока линкерные скрипты для меня страшны