|
scmRtos для медных чайников |
|
|
|
Feb 12 2012, 09:04
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Добрый день всем! Возникло желание - точнее, необходимось использовать многозадачность в своем проекте - вернее, или надо писать свой диспетчер (в котором я уже успел запутаться), или пользоваться чем-то готовым. Увидел scmRtos - попытался запустить демку. Пример под IAR на MSP430F2617 - у меня на плате MSP430F2410, IAR версия 5.30
Немножко подправил демку под свою плату, чтобы нужный светодиодик моргал, указал иару на MSP430F2410 - и ничего. WDT прерывание случается раза 4 (вроде как это системный таймер?), после чего программа улетает неведомо куда.
Кто-нибудь может на путь истинный наставить - что можно трогать, что нельзя. Может ли на работоспособности версия компилятора сказаться? Или, лучше всего, может у кого готовая рыба завалялась для моргания именно на этом кристалле или похожем?
|
|
|
|
10 страниц
1 2 3 > »
|
 |
Ответов
(1 - 99)
|
Feb 12 2012, 18:11
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Цитата(dxp @ Feb 12 2012, 19:34)  А зачем вы в самые недра ядра-то полезли? Это не место для пользовательского кода. И с чего взяли, что тут должен быть периодический сигнал? Вы документацию-то читали? Используйте для формирования таких сигналов пользовательские процессы и функцию sleep(). так не работало вообще ничего - надо ж как-то определяться было. Я ж предупреждал - чайник медный  Я понимаю, что коду там не место - но как-то понять, работает или нет надо было. Насчет документации - грешен, не читал еще. Определить работоспособность пытался по аналогии с FreeRtos - там системный таймер похожим образом сделан. Спасибо за подсказку. Подход может быть и тупой - но просто хотелось убедиться, что элементарный готовый пример будет на моем железе и с моим компилятором работать - а потом уже разбираться.
|
|
|
|
|
Feb 14 2012, 03:52
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (varvar @ Feb 13 2012, 23:17)  Я с примеров и начинал - с моей версией ИАРа и 3.10 версией scmRtos программа улетала непонятно куда - по крайней мере кода в той области, где я ее останавливал, не было. 4-ая версия работает - по крайней мере, и демки, и мои попытки их модификаций. Самое время начать читать документацию. 3.10 делалась довольно давно и тестировалась на вверсии IAR 4.2х. В IAR 5.xx поменяли поведение компилятора в части размещения обработчиков прерываний, и получалось, что некоторые обработчики прерываний не линковались. В 4-ке этот момент был пофиксен. Использовать 3.10 в новых проектах нет вообще никакого смысла. QUOTE (varvar @ Feb 13 2012, 23:17)  Кстати, у тексаса не увидел никаких упоминаний о Вашей операционной системе. Они не знают о ней или игнорируют? Или я плохо искал? К TI это вообще не имеет никакого отношения. И этих осей как собак бездомных, чего такому монстру, как TI, обращать на это внимание. Он микрухи делает и поддержку для некоторых из них (TMS) в виде тулчейна и своей собственной операционки.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 14 2012, 20:04
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Попытаюсь воспользоваться еще раз добротой и отзывчивостью авторов, уже чуть более конкретно. Одна из моих задач отправляет радиопакет по таймеру (прерывание номер раз). Для управления используется аппаратный SPI - прерывание номер два. Когда данные отправлены - передатчик генерирует прерывание три. После чего он переключается на прием в и течении определенного времени ждет прерывания от приемника. Дождался - считывает данные. Нет - выключается приемник и все начинается с начала. Какими средствами scmRTOS кошерно воспользоваться здесь? Сделать одну задачу с семафорами или две - одна обслуживает SPI, а вторая трансмиттер? И второй вопрос - пусть это будет UART только на передачу по прерываниям и у него есть буфер. Как поступить при заполнении буфера, чтобы приостановить программу? Можно ли как-то семафоры разместить не в задаче, а в вызываемых подпрограммах? или вообще все как-то иначе лучше сделать? Заготовка кода на чистом С выглядит примерно так (без всяческого контроля, только опустошение буфера): Код uint8 TxBuffer[16]; uint8 TxBufIndexIn; uint8 TxBufIndexOut;
void Init_UART(void) { P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 138; // 16MHz 115200 UCA0BR1 = 0; // 16MHz 115200 UCA0MCTL = UCBRS2 + UCBRS1 + UCBRS0; // Modulation UCBRSx = 7 UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine IFG2 |= UCA0TXIFG; // ready to start int TxBufIndexIn=0; TxBufIndexOut=0; }
int putchar( int data ) { TxBuffer[TxBufIndexIn++] = data; TxBufIndexIn &= 0x0F; IE2 |= UCA0TXIE; return data; }
#pragma vector=USCIAB0TX_VECTOR __interrupt void USCI0TX_ISR(void) { UCA0TXBUF = TxBuffer[TxBufIndexOut++]; TxBufIndexOut &= 0x0F; if (TxBufIndexOut == TxBufIndexIn) IE2 &= ~UCA0TXIE; // Disable USCI_A0 TX interrupt } Контроль переполнения можно как-то сделать в putchar остановив задачу или все-таки где-то в самой задаче это делать? Если вопросы слишком наивные - как медный чайник, обещаю обзавестись свистком  А вообще - Ваша документация описывает все, но вот из нее бы выжимку для чайников сделать, без полного описания что и как работает. Типа - делай так - и вот тебе пример. Тем более, у большинства начинающих пользоваться и вопросы возникают практически одинаковые. А пока читаешь полную документацию, дойдя до середины, уже забудешь, что было в начале. Такая подробная нужна уже тогда, когда элементарные вещи делаешь без проблем и нужны уже тонкости. А для начала бы список функций с кратким пояснением на пару страниц - или в качестве приложения к документации. P.S. по второму вопросу - видимо, нужны channel и я плохо смотрел приметы?
Сообщение отредактировал varvar - Feb 14 2012, 20:06
|
|
|
|
|
Feb 15 2012, 05:04
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
1. В процессе ждать флаг события от таймера, когда флаг просигнален, отправить в SPI. Тут если скорость SPI высокая, а МК не очень быстрый, то, возможно, имеет смысл не заморачиваться с прерываниями, а просто поллить флаг окончания передачи - с переходами в другие процессы может получиться тормознее и накладнее. Если скорость SPI медленная по сравнению с темпом выполнения инструкций процессора, то просто после инициирования отправки в этом же процессе ждать другого флага событий, который просигналит уже обработчик прерывания передатчика SPI. Дождались, пошли дальше - теперь ждём, как я понял, данных от приёмника, но ждём не вечно, а в течении какого-то времени и ждём не просто события, а данных. Поэтому тут логично было бы использовать OS::message<> - создать объект-сообщение для ожидаемого типа и ждать его с таймаутом. Пришли данные до истечения таймаута - одни действия, таймаут истёк - другие. Весь код получается простой и линейный в одном процессе.
2. Да, OS::channel<> вполне нормально подходит. Но, возможно, пойдёт и просто кольцевой буфер - зависит от приложения, от того, какие источники и как они обращаются к буферу передатчика. Возможно, проще будет использовать кольцевой буфер с критическими секциями. Но и канал тоже нормально подходит, единственное, надо следить, чтобы в ISR передатчика канал не пытался встать на ожидание, т.е. надо следить за тем, что обработчике прерываний перед извлечением из канала очередного элемента канал не пуст. Иначе он будет вставать в ожидание с попыткой отдать управление ядру, а это чревато негативными последствиями.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Feb 22 2012, 06:18
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 23-09-08
Из: Россия
Пользователь №: 40 430

|
Здравствуйте. Чтобы не плодить лишних тем решил отписаться здесь. Пытаюсь запустить scmRTOS 4.00 на LPC1766. CodeSourcery + Eclipse. За основу взял GCC пример для STM EventFlag. Проблема в том, что работает только процесс Proc1. Управление процессам Proc2 и Proc3 не передается. Соответственно светодиод led2 не работает. Флаг TimerEvent в system_timer_user_hook взводится и обрабатывается процессом Proc1. Светодиод led1 моргает как и положено. Код запускаю из RAM. Возможно в этом и грабли. Но хотелось бы понять в чем дело. Недавно запускал такой пример для LPC1766 и IAR для scmRTOS 3 версии. Проблем не было. Буду благодарен за любые замечания. Проект прикрепил.
lpc17xx.zip ( 370.31 килобайт )
Кол-во скачиваний: 1208
Сообщение отредактировал tamam - Feb 22 2012, 09:38
|
|
|
|
|
Feb 22 2012, 08:05
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
У меня всё уже работает (1-EventFlag и 4-Debug и начинаю писать рабочий проект), именно на LPC1766+GCC Но из флеша, в RAM меня пока не тянет. Сейчас нет сил, вечером как-то причешу и оформлю. Я бы уже и в репозиторий положил, но мне не нравится то, что я написал по аналогии с pin.h из примеров для Cortex-M3, а решить, как переделать — нет времени.
Если забуду — постучите завтра в личку, мне на почту уведомление придёт.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 22 2012, 09:12
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 23-09-08
Из: Россия
Пользователь №: 40 430

|
Цитата(AHTOXA @ Feb 22 2012, 12:10)  Ага. И первым делом вписал свой копирайт в мой мейкфайл  Вообще-то так не делается. Виноват, Обидеть не хотел. Я его сначала начал сам писать и конкретно запарился, а потом взял за основу Ваш. Но пока разбирался, было не до копирайта. Только переползаю на GCC. Исправил.
Сообщение отредактировал tamam - Feb 22 2012, 09:38
|
|
|
|
|
Feb 22 2012, 17:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Цитата(ReAl @ Feb 22 2012, 10:05)  Если забуду — постучите завтра в личку, мне на почту уведомление придёт. Сам вспомнил :-) Но все равно откладывается. Там хоть и примеры, но много завязано на конкретную мою плату и уже почикано под пробу конкретных моих заморочек. На работе есть плата SK_MLPC1768, я на ней подниму примеры, вычищу лишнее, тогда можно будет показать. Для начала 1-EventFlag, он по сравнению с STM32-шным уже изменён. Приведён в соответствие с avr-gcc-шным.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 22 2012, 19:02
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 23-09-08
Из: Россия
Пользователь №: 40 430

|
Спасибо, буду разбираться дальше.
|
|
|
|
|
Feb 26 2012, 11:55
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Прошу прощения за задержку. 23-го первый пример был доведён до удобоваримого состояния. Но я понял, что если я вброшу архив сюда, то в репозитории он появится нескоро ввиду отсутствия хоть какого-то «гвоздика». AHTOXA подвигал каталоги и я забросил пример на его законное место pre-v400/Samples/CortexM3/GCC/LPC17XX/4-Debug добавлю на днях. Он рабочий, просто тоже вычистить немного нужно. Остальные буду писать по мере поступления на склад очередных партий минут свободного времени, аккуратно упакованных в пачки по 30-40 штук. p.s. Просто пример 1-EventFlag мне интересен как источник данных для сравнения Вот, к примеру, в пересчётне на ту же тактовую у STM8 общее время переключения процессов на «дулі відсотка» меньше, чем у AVR, но при этом собственно время переключателя контекстов ощутимо меньше, а поиск готового процесса — немного больше. Просто любопытно. А 4-Debug хорош как база для начала отладки реальной работы. Потому с них и начал.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Feb 27 2012, 12:46
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 23-09-08
Из: Россия
Пользователь №: 40 430

|
Спасибо за оперативность. Разбираюсь....
|
|
|
|
|
Jul 12 2012, 08:29
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Товарищи гуру и приближенные к ним! Помогите решить еще одну чайниковскую проблему - процесс крутится в своем бесконечном цикле, и хотелось бы, чтобы он крутился каждые N циклов системного таймера. Сейчас он делает все задачи и ложится спать на определенное время, но, в связи с тем, что задачи выполняются не каждый раз за одно и то же время - период процесса тоже меняется. Конечно, можно запустить еще один таймер и пусть он генерирует событие, которого процесс и будет ждать, но хотелось бы обойтись системным таймером. Еще один тупой путь - запустить еще один процесс, который только спит, и просыпаясь, генерирует событие для другого процесса. Но как-то это выглядит не кошерно.
|
|
|
|
|
Jul 12 2012, 08:54
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
Как-то так. Код void SleepUntil(tick_count_t tick) { tick_count_t current_tick = OS::get_tick_count(); // Если уже больше, то спать-то и некогда if (current_tick < tick) sleep(tick - current_tick); } template<> void TProc1::exec() { tick_count_t next_tick;
next_tick = OS::get_tick_count(); for(;;) { do_busy_work(); next_tick += task_period; SleepUntil(next_tick); } } Обработка ситуаций, когда спать уже некогда (ждать следующей метки или не ждать вообще) — по требованиям к задаче. Также надо учесть, что tick_count_t и timeout_t имеют (могут иметь) разные размеры, тогда надо бы брать разность и «досыпать» порциями, влазящими в timeout_t.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Aug 3 2012, 09:06
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
доброго времени днутра или ночера...
есть комплект stm32f0diskovery - требуется откомпилить и запустить какой нибудь из примеров под scmRTOS .. как я понял примеров пока под cortex-m0 не существует... и ос тоже непонятно работает или нет
ТАК???
помогите пжста чайнику...
|
|
|
|
|
Aug 6 2012, 08:12
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
Цитата(_Артём_ @ Aug 3 2012, 11:53)  Примеров нет, но порт есть: порт для Cortex-M0да да ... я порт нашел... не могу понять как переделать пример для себя... чтоб перекомпилить и чтоб заработало... нет некоторых файлов типа стартап.си... и прочих
|
|
|
|
|
Aug 7 2012, 08:06
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
Цитата(_Артём_ @ Aug 6 2012, 13:58)  Update: вспомнил ещё ссылку - там стартап и тптам для LPC11xx а stm32f0 нет ...
|
|
|
|
|
Aug 16 2012, 08:57
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
Цитата(_Артём_ @ Aug 7 2012, 10:56)  Большая разница? Там и там Cortex-M0. мэй би ес, мэй би ноу.... описание регистров и системных переменных совершенно разное ... программист как писатель... захотел назвал так переменную захотел по другому... может быть различное количество переферии, разные векторы прерываний и прочее... проект переделал из stm32f2xx отключил кой чего и кой где... отключил макросы для работы с пинами (pin.h) с шаблонами я пока не очень то разбимрался и не совсем понимаю чего там понаворочали... проект компилится... хотелось бы наладить связь с разработчиками этой освр для того чтоб допилить по ума этот порт...
|
|
|
|
|
Aug 16 2012, 11:39
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Посторонним В... @ Aug 16 2012, 11:57)  описание регистров и системных переменных совершенно разное ... Регистры ядра одни и те же? Какие ещё системные переменные? О чём вы? Цитата(Посторонним В... @ Aug 16 2012, 11:57)  может быть различное количество переферии, разные векторы прерываний и прочее... Стартап нужен соответствующий.
|
|
|
|
|
Aug 21 2012, 03:43
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
Цитата(AHTOXA @ Aug 16 2012, 15:44)  Разработчики все здесь, так что, считайте, связались  Антон, хотелось бы с вашей помощью "допилить" порт cortex-m0 для stm32f0xx до рабочего состояния... ну и опубликовать естественно... сейчас нахожусь на этапе... sturtup, ld-script, sysinit переписаны... остольное взято с сайта... с этими файлами перекомпилил и запустил демку для дискавери... (дефолтная) т.е. файлы вроде как рабочие... проблема такая... при запуске системы работает только одна задача - первая... и не работает функция sleep(); похоже контекст не переключается... платформо зависимую часть брал из "ветки" демку и настройки системы взял от stm32f2xx... как с вами Антон связаться...??? кроме как в форуме ??? думаю работа пошла бы оперативнее..
|
|
|
|
|
Aug 22 2012, 04:26
|
Участник

Группа: Участник
Сообщений: 41
Регистрация: 2-08-12
Пользователь №: 72 984

|
Цитата(_Артём_ @ Aug 21 2012, 20:37)  Странно, не собирается: сори... надо src и мэйк в папку проекта бросить как у примеров РТОС ну или мэйк надо немного поправить
|
|
|
|
|
Sep 8 2012, 16:17
|

Частый гость
 
Группа: Участник
Сообщений: 93
Регистрация: 5-01-05
Из: Оулу
Пользователь №: 1 811

|
Цитата(ReAl @ Sep 6 2012, 23:36)  Если подозрение на стек -- увеличить стек для процесса, использующего printf Действительно, очевидное решение. И ведь даже увеличивал - но не думал, что надо так сильно увеличить. 500 байт хватило. Спасибо!
|
|
|
|
|
Oct 3 2012, 02:09
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Помогите пожалуйста определиться со структурой процессов, потоков данных и приоритетами для процессов. Есть следующий дизайн: Удалённый терминал сбора данных. Состав: - Процессор MSP430F210 - Связь с хостом по RS485-slave (используется ModBus, но это непринципиально). (UART) - Связь головкой сбора данных по RS485-master (UART) - Пользовательский интерфейс: 4 кнопки и 3-4 строчный графический дисплей. Связь с ним по SPI через расширитель. При нажатии на кнопки вырабатываются прерывания. - Управление 3мя реле через GPIO - Внешний RTC с интерфейсом I2C. RTC может вырабатывать прерывания. Скажем, раз в секунду. - Внутренняя используемая периферия: 3 канала PWM для медленно меняющихся сигналов, ADC для отслеживания уровня питания, внтуренний EEPROM По первой прикидке представляется следующее (в порядке приоритета) - RS485_Slave_Proc - включает в себя обработку прерываний от UART, чтение команды/данных от хоста и соответствующее реагирование на них. Использует channel для передачи и приёма данных в/из DataProcessing_Proc. Длина канала TBD.
- DataProcessing_Proc - фактически коммутатор данных между процессами с декодером команд. Формирует необходимые данные для периферии в нужных форматах.
- UI_Proc - Обслуживание пользовательского интерфейса. Включает в себя обработку прерываний от SPI. Использует message для передачи кода нажатой кнопки в DataProcessing и channel для передачи отображаемой информации на дисплей. Отображаемая информация пока только текстовая, т.е. этот процесс содержит в себе декодер ASCII в графику.
- RS485_Master_Proc - Включает в себя обработку прерываний от UART. Но не для скорости ответа, а для того, чтобы можно было послать запрос и заниматься остальными делами пока не появится ответ. Как вариант, можно и без прерываний, т.е. в одном цикле запросил данные, в следующем - проверил и если есть, то забрал. Использует, скорее всего, message.
- LowSpeed_Proc - включает в себя обработку прерываний от RTC (раз в секунду или минуту) и считает время до следующего обслуживания , по данным от DataProcessing включает и выключает реле, по данным от него же выставляет новые значения на PWM, работает с EEPROM, читает АЦП, измеряющее напряжение питания. Передача данных через структурированные мессаджи, т.е. message представляет из себя структуру необходимых данных.
Сразу возникают несколько вопросов: - Не имеет ли смысла UI_Proc разделить на отдельные процессы работы с кнопками и дисплеем даже при том, что они используют один физический интерфейс? - Имеет ли смысл вынести в отдельные процессы работу с RTC (редко) и с EEPROM (долго - надо ждать флага). Или просто внутри одного процесса пройти по всей этой периферии, благо всё это медленно? А может и RS485_Master вставить в LowSpeed? -
|
|
|
|
|
Oct 4 2012, 04:35
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Никто, кроме вас, не знает, как лучше распределить ресурсы в программе под вашу задачу. Общее правило такое: всё, что не может ждать, помещать в более приоритетные процессы, чем срочнее, тем приоритетнее. Какие там конкретно требования по времянкам, это вам известно, от этого и отталкивайтесь.
По поводу пользовательского интерфейса - тоже вам виднее, но я бы не разделял, кнопки не по прерываниям обрабатывал, а по опросу, синхронизированному с основным циклом UI.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Oct 4 2012, 19:31
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
dxpСпасибо за ответ. Про общее правило - это-то понятно. Не вчера за программирование микроконтроллеров сел  Собственно я и прикинул структуру из общих соображений и понимания того, что мне надо. Да и вообще, изложенное на бумаге/в форуме позволяет лучше сформировать собственное понимание того, что надо  Просто некоторые тонкости работы с вашей системой могут быть таковы, что варианты могут быть разными. Тем более, если эти тонкости могут быть указаны авторами системы. В частности, совет по поводу опроса кнопок по опросу учту. Сейчас у себя поменяю инициализацию. Но вот вопрос совмещения или разделения кнопок и дисплея в олдном процессе остался. Основное в нём то, что используется один SPI. Стоит на этом базироваться или просто иметь в виду, что это единый ресурс для двух процессов, которые всегда вызываются в разное время? Я пока сделал следующее объявление: Код //--------------------------------------------------------------------------- // // Process types // typedef OS::process<OS::pr0, 200> TProc1; typedef OS::process<OS::pr1, 200> TProc2; typedef OS::process<OS::pr2, 200> TProc3; typedef OS::process<OS::pr3, 200> TProc4; typedef OS::process<OS::pr4, 200> TProc5; //--------------------------------------------------------------------------- // // Process objects // TProc1 RS485Slave_Proc; // interface to a host TProc2 DataProcessing_Proc; TProc3 UI_Buttons_Proc; // reading buttons status TProc4 UI_TextDisplay_Proc; // display text information TProc5 LowSpeed_Proc; // Relay, RTC, PWM (4-20mA control), Power ADC, EEPROM, RS485 master Ага, сейчас понял, что для случая, который я сейчас показал, для SPI должен использоваться Mutex. Я прав?
|
|
|
|
|
Oct 4 2012, 21:11
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(_Артём_ @ Oct 4 2012, 13:10)  Ну да. Через mutex обычно и делается. Спасибо. Насколько я понимаю, у тебя есть опыт работы с этой системой. Пока уважаемые авторы системы заняты, может подскажешь по поводу моей структуры. Нормально или что-то изменил бы?
|
|
|
|
|
Oct 5 2012, 00:35
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(Chudik @ Oct 5 2012, 02:54)  Не нашёл в документации других членов класса process кроме так exec. Это так и должно быть? Да, где-то так: Код template<TPriority pr, size_t stack_size> class process : public TBaseProcess { public: INLINE_PROCESS_CTOR process();
OS_PROCESS static void exec(); #if scmRTOS_PROCESS_RESTART_ENABLE == 1 INLINE void terminate(); #endif Но так как process насладник TBaseProcess, то есть ещё методы, перешедшие по наследству от TBaseProcess: Код static void sleep(timeout_t timeout = 0); void wake_up(); void force_wake_up(); INLINE void start() { force_wake_up(); }
INLINE bool is_sleeping() const; INLINE bool is_suspended() const; /// и так далее.....
|
|
|
|
|
Oct 5 2012, 16:41
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Локальной тоже может. Например, представьте, что у вас есть несколько пулов такого вида: Код class Pool { public: void lock() { mutex_.lock(); } void unlock() { mutex_.unlock(); } bool try_to_lock() { return mutex_.lock_softly(); } ... private: OS::TMutex mutex_; ... } У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока. --- Ой, что-то я поспешил. Это же не локальные объекты, это как раз члены класса Зачем могут понадобиться локальные мутексы - с ходу не придумалось.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 5 2012, 17:03
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Oct 5 2012, 19:41)  Локальной тоже может. Класс тоже может быть локальной переменной. Цитата(AHTOXA @ Oct 5 2012, 19:41)  Зачем могут понадобиться локальные мутексы - с ходу не придумалось. Говорят глобальные переменные - это плохо, чем их меньше, тем лучше.
|
|
|
|
|
Oct 5 2012, 23:59
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(AHTOXA @ Oct 5 2012, 09:41)  У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока. Вот, вот. На удивление нужно именно это  Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними? Дело в том, что в последний раз с С++ я работал лет 15 назад и потому сейчас приходится всё вспоминать по-новой. При этом тогда это были модели обработки сигналов на РС, которые потом перекидывались в DSP, но обработка уже писалась на соответствующем ассемблере. Т.е. мутексы просто не требовались. Так что не только вспоминать приходится, но и кое-что узнавать. Ещё хорошо, что с месяц назад поработал на подхвате на проекте с freeRTOS. Вспомнились приёмы работы с RTOS в принципе
|
|
|
|
|
Oct 6 2012, 03:07
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(_Артём_ @ Oct 5 2012, 18:03)  А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )? Устраивают, но при отстутствии опыта работы с этой системой написать свои драйвера под неё в грамотном стиле займёт не меньше недели. Если не больше. А если автор системы сможет дать авторский вариант таких драйверов, это сильно упростит дело. В обмен потом смогу выложить драйвер графического дисплея в текстовом режиме, работающего по этому SPI. И попозже драйвер I2C, созданный по образу и подобию. RS485 на базе того же UART. Нужна точка опоры
|
|
|
|
|
Oct 6 2012, 08:53
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Chudik @ Oct 6 2012, 05:59)  Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними? Вот SPI.h+Pin.h:
spi_msp430.zip ( 3.15 килобайт )
Кол-во скачиваний: 94Используется это примерно так: Создаём шаблон для устройства, подключённого к SPI (в данном случае - цепочка микросхем Max7219) Код template<int chip_count, typename cs_pin> class TMax7219 { private: spi_base_t& spi; typedef cs_pin CS; inline void select(void) { spi.lock(); CS::On(); } inline void deselect(void) { CS::Off(); spi.unlock(); } inline void write(uint16_t w) { spi << w; } void write_all(uint16_t w) { select(); for (int i = chip_count; i; i--) write(w); deselect(); } public: TMax7219(spi_base_t& spiref) : spi(spiref) { CS::Off(); CS::Direct(OUTPUT); } void set_sleep(bool value) { write_all(value ? 0x0C00 : 0x0C01); } void set_test(bool value) { write_all(value ? 0x0F01 : 0x0F00); } void set_brightness(uint8_t value) { write_all(0x0A00 | (value & 0x0f)); } ... } Затем (файл hw.h): Код #include "pin.h" #include "spi.h"
typedef spi_t<SPI1> TSpi1; extern TSpi1 spi1;
#include "max7219.h" typedef TMax7219<2, Pin<5, 4, 'L'> > TMax7219; extern TMax7219 Max; И, наконец, hw.cpp: Код TSpi1 spi1; TMax7219 Max(spi1);
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 6 2012, 20:25
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
AHTOXAОгромное спасибо! Как раз первое, что я собирался делать - это дисплей через SPI. У меня уже сделан аналогичный дисплей тоже через SPI для предыдущего проекта без RTOS. Буду теперь соединять двух ёжиков  Надеюсь, что это не займёт слишком много времени.
|
|
|
|
|
Oct 11 2012, 22:54
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
AHTOXAПрикинул объявление класса для дисплея. Посмотри пожалуйста с точки зрения формы и логичности. Может что-то подправить? Код template<typename cs_pin> class TDisplay { private: spi_base_t& spi; typedef cs_pin LCD_CS; Pin<2, 6, 'H'> LCD_RS; // H for Data, L for Command unsigned char *font; uint8_t fontnumber, fontwidth, fontheight; uint8_t x, y; // position on the screen inline void select(void) { spi.lock(); LCD_CS::On(); } inline void deselect(void) { LCD_CS::Off(); spi.unlock(); } inline void send(uint8_t data) { spi << data; } void send_array(uint8_t *data, uint16_t count) { select(); for(uint16_t i=0; i<count; i++) spi << data[i]; deselect(); } void send_command(uint8_t *data, uint16_t count); void send_data(uint8_t *data, uint16_t count); void goto_xy(uint8_t x, uint8_t y); public: void TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref); void Set_contrast(uint8_t data); void ClrLines(unsigned char startline, unsigned char linesnum); // Clear number of text lines void ClrText(unsigned char line, unsigned char xpos, unsigned char length); // Clear part of the line
void SetFont(uint8_t num); uint8_t GetFont(void); void putchar(unsigned char ch, uint8_t xpos, uint8_t ypos); void putstring(char *string, uint8_t xpos, uint8_t ypos); void ShowSoftFont(unsigned char num);
} Здесь только для вывода текста. Мне пока графика не нужна. Функции будут описаны в другом файле. Они есть в виде функций C. Надеюсь, что не придётся менять слишком много. Блин, разрываюсь между тремя проектами: пара хардверных и этот. Скорость написания никакая.
|
|
|
|
|
Oct 13 2012, 04:07
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(AHTOXA @ Oct 11 2012, 20:33)  по ходу дела всегда можно что-то подправить/изменить/добавить. Ну да, что и происходит. Посмотри пожалуйста. Код template<typename cs_pin> class TDisplay { private: spi_base_t& spi; typedef cs_pin LCD_CS; Pin<2, 6, 'H'> LCD_RS; // H for Data, L for Command Pin<1, 4, 'L'> LCD_RST; // Active 0, set to it during CSL uint8_t status; // 1/0 - On/Off. OLED requires to be off when not in use unsigned char *font; uint8_t fontnumber, fontwidth, fontheight; uint8_t x, y; // position on the screen inline void select(void) { spi.lock(); LCD_CS::On(); } inline void deselect(void) { LCD_CS::Off(); spi.unlock(); } inline void send(uint8_t data) { spi << data; } void send_array(uint8_t *data, uint16_t count) { select(); for(uint16_t i=0; i<count; i++) spi << data[i]; deselect(); } void send_command(uint8_t *data, uint16_t count); void send_data(uint8_t *data, uint16_t count); void goto_xy(uint8_t x, uint8_t y); public: TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref); void Set_contrast(uint8_t data); uint8_t getstatus(void); void On(void); // Because of using OLED display void Off(void); // Because of using OLED display void SetFont(uint8_t num); uint8_t GetFont(void); void ClrLines(unsigned char startline, unsigned char linesnum); // Clear number of text lines void ClrText(unsigned char line, unsigned char xpos, unsigned char length); // Clear part of the line void putchar(unsigned char ch, uint8_t xpos, uint8_t ypos); void putstring(char *string, uint8_t xpos, uint8_t ypos); void ShowFont(unsigned char num); } И несколько начальных функций. Не надо-ли что-то подправить? Хотелось бы понять перед тем, как перейду к описанию public функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. Массив init приведён просто для референса. С ним как раз более-менее всё понятно.  Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены  Код const uint8_t init[] = {0x40, //Display start line 0 0xa1, //ADC reverse <<<< Probably need to be changed 0xc0, //Normal COM0...COM63 0xa6, //Display normal 0xa2, //Set Bias 1/9 (Duty 1/65) 0x2f, //Booster, Regulator and Follower On 0xf8, //Set internal Booster to 4x 0x00, 0x27, //Contrast set 0x81, 0x16, 0xac, //Set indicator 0x00, //0x01, 0xAF, //}; //Display on 0xb0, //Page start sddress 0 0x10, //Set Higher Column Start Address 0 0x00 //Set Lower Column Start Address 0 };
/**************** Functions **************************************************/
void TDisplay::send_command(uint8_t *data, uint16_t count) { LCD_RS::Off(); // switch to send command send_array(data, count); // SPI CS controlled inside this function }
void TDisplay::send_data(uint8_t *data, uint16_t count) { LCD_RS::On(); // switch to send data send_array(data, count); // SPI CS controlled inside this function }
// Set symbol position in text mode //Parameter: // x: X - Position on screen (0 - 127) // y: Y - Position on screen (0 - 8) void TDisplay::goto_xy(uint8_t x, uint8_t y); { uint8_t set[] = {0xb0, 0x10, 0x00}; //Control commands array set[0] += y; //Y - Add Y Position to Set Page Start Address set[1] += x >> 4; //High - Nibble auf Steuerbefehl addieren set[2] += x & 0x0f; //Low - Nibble auf Steuerbefehl addieren send_command(set, 3); }
//TDisplay constructor TDisplay::TDisplay(uint8_t *init, spi_base_t& spiref): spi(spiref) { LCD_RST::Off(); // unreset LCD send_command((uint8_t *)init, sizeof(init)); // Initialization
for(uint8_t line=0; line<8; line++) // clear display memory { goto_xy(0, line); spiref.select(); send(0); spiref.deselect(); } }
|
|
|
|
|
Oct 13 2012, 05:10
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Я, честно говоря, не совсем понимаю, что я должен там высмотреть  В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё. Единственное замечание: если у вас шаблон Код template<typename cs_pin> class TDisplay { ... , то реализация функций должна быть в том же *.h файле, и выглядеть вот так: Код template<typename cs_pin> void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count) { ...
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 13 2012, 18:54
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Ну, вот такие замечания и нужны  Спасибо. Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам  Мне только, чтобы по форме правильно было. А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.
|
|
|
|
|
Oct 15 2012, 03:26
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Chudik @ Oct 14 2012, 00:54)  А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле. Короче, лучше про это почитать какую-нибудь книжку
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 17 2012, 23:45
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
AHTOXAполучил сообщение в IAR Код Error[Pe020]: identifier "namespace" is undefined D:\Designs\M3\Firmware\M3_Terminal\scmRTOS\Common\usrlib.h 52 Пример Event компилируется. В нём такой ошибки, естественно, не возникает. Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал? Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять...
|
|
|
|
|
Oct 18 2012, 18:40
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Посмотрел опции компиляции. Там стоял автоматическкий выбор компилятора в зависимости от расширения. Поставил использование С++ - этот момент прошёл нормально. Теперь пытаюсь понять, почему Код Error[Pe864]: spi_t is not a template D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19 Error[Pe020]: identifier "SPI1" is undefined D:\Designs\M3\Firmware\M3_Terminal\M3_Terminal.h 19 при том, что spi.h включён в проект.
|
|
|
|
|
Oct 18 2012, 19:36
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Конечно: Код #ifndef M3_TERMINAL_H #define M3_TERMINAL_H
#define CSL_used
#include "Peripheral\pin.h" #include "Peripheral\spi.h"
typedef spi_t<SPI1> TSpi1; extern TSpi1 spi1;
typedef TDisplay < Pin<2, 5, 'L'> > TDisplay; extern TDisplay display;
#endif // M3_TERMINAL_H
|
|
|
|
|
Oct 18 2012, 21:00
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Разобрался, мой косяк был - кросс ссылки на файлы .h  Цитата(AHTOXA @ Oct 18 2012, 12:49)  3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа. в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201
|
|
|
|
|
Oct 18 2012, 21:20
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AHTOXA @ Oct 18 2012, 22:49)  в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо. А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. К примеру в Eclipse или Visual Studio хидеры включаются в проект. IAR EW - тоже какбы-IDE. Цитата(Chudik @ Oct 19 2012, 00:00)  Разобрался, мой косяк был - кросс ссылки на файлы .h Кросс ссылки - это что? Не представил...
|
|
|
|
|
Oct 19 2012, 04:54
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Chudik @ Oct 19 2012, 03:00)   Цитата(_Артём_ @ Oct 19 2012, 03:20)  А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать. Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp. Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Oct 19 2012, 20:22
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Цитата(AHTOXA @ Oct 18 2012, 21:54)  Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно. Угу, именно так.
|
|
|
|
|
Oct 26 2012, 22:32
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Ничего не понимаю Код Error[Pe020]: identifier "U0CTL" is undefined G:\My_Designs\RKI\M3\Firmware\M3_Terminal\Peripheral\spi.h 104 Где этот U0CTL определён? Когда начинаю искать, то указывает только на spi.h Если подключаю "msp430.h", то эта ошибка исчезает, но при этом возникает другая: Код Error[Pe101]: "IE1" has already been declared in the current scope (at line 108 of "E:\Design\TI\IAR Systems\Embedded Workbench 6.4\430\inc\io430x24x.h") E:\Design\TI\IAR Systems\Embedded Workbench 6.4\430\inc\msp430f2410.h 133 detected during compilation of secondary translation unit "G:\My_Designs\RKI\M3\Firmware\M3_Terminal\M3_Terminal.cpp" посмотрел директории с файлами msp430...h Нашёл, что там кроме этого есть io430x....h , причём msp430... для С, а io430... = для С++. Хорошо, подумал я. Хоть не любитель менять системные файлы, но сделал следующее в msp430.h Код #ifdef __cplusplus #include <io430.h> #else // здесь выбор кокретного файла, отвечающего за нужный чип #endif /* ifdef __cplusplus */ Но при этом опять возвращается к первой ошибке из указанной здесь. Посоветуйте, что делать?
|
|
|
|
|
Oct 26 2012, 23:57
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Логично, конечно. Сейчас посмотрю. Мне казалось, что они одинаковые...  ====================== Посмотрел. Регистры совсем другие. Ладно, попробую разобраться.
|
|
|
|
|
Oct 27 2012, 03:18
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Регистры переназначил. Функцию rw для SPI подправил в соответствии с переписанными регистрами. Эта часть откомпилировалась. Теперь вопросы: в spi.h определено: Код template <spi_num_t> // строка добавлена, поскольку без неё потом появлялась ошибка при использовании класса spi_base_t class spi_base_t { private: OS::TMutex mutex; public: .... В соответствии с указаниями маэстро в http://electronix.ru/forum/index.php?showt...t&p=1099201пишу Код typedef spi_base_t<SPI1> TSpi1; extern TSpi1 spi1; // << line 19 in errors list Соответственно получаю ошибку: Код Error[Pe322]: object of abstract class type "spi_base_t<(spi_num_t)1U>" is not allowed: function "spi_base_t<<unnamed>>::rw [with <unnamed>=(spi_num_t)1U]" is a pure virtual function G:\My_Designs\RKI\M3\Firmware\M3_Terminal\M3_terminal.h 19 Также на описание класса spi_t в spi.h Код template <spi_num_t spi_num> class spi_t : public spi_base_t <spi_num> // added <spi_num> { private: typedef spi_regs_t<spi_num> regs; typedef spi_pins_t<spi_num> pins_t; typedef typename pins_t::PinSCK SCK; typedef typename pins_t::PinMISO MISO; typedef typename pins_t::PinMOSI MOSI; public: spi_t(): spi_base_t() { init(); } // << line 151 in errors list получаю следующие ошибки: Код Error[Pe441]: argument list for class template "spi_base_t" is missing G:\My_Designs\RKI\M3\Firmware\M3_Terminal\Peripheral\spi.h 151 пытался ставить Код spi_t(): spi_base_t(spi_num) { init(); } spi_t(): spi_base_t<spi_num> { init(); } не помогает Уфф... тяжко. Надеюсь, что когда проделаю первые шаги дальше будет легче
|
|
|
|
|
Oct 27 2012, 05:53
|
Частый гость
 
Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676

|
Ага, спасибо, поменял. Полегчало.  Соотвественно, убрал свои изменения для второй части вопроса. Теперь уже после того, как эта часть откомпилировалась, буду свой класс дисплея допиливать.
|
|
|
|
|
Jan 21 2013, 10:38
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
добрый день! появилась необходимость использовать scmRTOS в своём проекте. пробовал 1-EVENT на кристаллах: STM32F100CB и STM32F103VG. не заработало ни на одном. изменял только main.cpp на предмет светодиодов. приборы взял заведомо рабочие. ни один процесс не запускается, хотя в main() программа заходит. т.е. принудительно светодиоды при инициализации МК включаются (на обеих железках). использую GCC 4.6.2. может в компиляторе какой косяк? собирается всё без ошибок. в makefile правил только компилятор, ну и загрузчик. подскажите пожалуйста куда посмотреть? только начинаю разбираться с ОС.
Сообщение отредактировал dezna - Jan 21 2013, 10:42
|
|
|
|
|
Jan 21 2013, 11:17
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(AHTOXA @ Jan 21 2013, 15:10)  Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело? я об этом думал. подключал осцилограф. на всякий случай попробовал - нет, не работает! LSS файл для сравниения. замена Pin<'B', 0> - <'B', 11>, Pin<'B', 1> - <'B', 12>
1_EventFlag.lss.txt ( 11.94 килобайт )
Кол-во скачиваний: 281
Сообщение отредактировал dezna - Jan 21 2013, 11:30
|
|
|
|
|
Jan 21 2013, 16:22
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались. Что за компилятор у вас? Попробуйте yagarto или kgp. С ними я проверял - работает.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 22 2013, 04:58
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(AHTOXA @ Jan 21 2013, 20:22)  В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались. Что за компилятор у вас? я просил товарища собрать мне рабочий пример. он у себя проверил - работает. на моей железке тоже. так вот: компилятор уоптимизировал программу до "нельзя" (судя по размеру в 3 раза). там нет упоминания о процессах вообще. судя по всему он посчитал включение выключение выходов не существенным! как это обойти? компилятор gcc-4.6.2 вот флаги сборки: Using built-in specs. COLLECT_GCC=/opt/arm-elf/bin/arm-elf-gcc-4.6.2 COLLECT_LTO_WRAPPER=/opt/arm-elf/libexec/gcc/arm-elf/4.6.2/lto-wrapper Target: arm-elf Configured with: ../gcc-4.6.2/configure --prefix=/opt/arm-elf --target=arm-elf --with-gnu-ld --with-gnu-as --disable-nls --disable-libssp --enable-interwork --enable-multilib --with-newlib --with-headers=../newlib-1.20.0/newlib/libc/include/ --enable-languages=c,c++ --with-float=soft --without-ppl Thread model: single gcc version 4.6.2 (GCC) Цитата(AHTOXA @ Jan 21 2013, 20:22)  Попробуйте yagarto или kgp. С ними я проверял - работает. yagarto - под линук не нашёл kgp - попробую но конечно хотелось бы разобраться с моей сборкой. могу куда-нибудь скинуть для проверки. потому как все остальные проекты то работают.
|
|
|
|
|
Jan 22 2013, 05:47
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dezna @ Jan 22 2013, 10:58)  COLLECT_GCC=/opt/arm-elf/bin/arm-elf-gcc-4.6.2 А, у вас не-eabi сборка. Она складывает конструкторы в другое место. Попробуйте в скрипт линкера после строки Код KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */ вставить Код KEEP(SORT(*)(.ctors))
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 22 2013, 06:21
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(AHTOXA @ Jan 22 2013, 09:47)  Код KEEP(SORT(*)(.ctors)) уже лучше, но всё равно чего-то ещё не хватает сравниваю один проект от 2-х компиляторов: <OS::TBaseProcess::init_stack_frame - раза в 2 меньше <Default_SystemTimer_ISR> - тоже <__Init_Data> - тоже. к сожалению в арм асме я "0", потому проанализировать не могу вот новый lss
1_EventFlag.lss.txt ( 25.05 килобайт )
Кол-во скачиваний: 266помогите пожалуйста добить этот вопрос!
|
|
|
|
|
Jan 22 2013, 10:11
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(AHTOXA @ Jan 22 2013, 12:20)  Сложно сказать. Листинг практически идентичен моему. init_stack_frame и Default_SystemTimer_ISR - вообще один-в-один. Должно работать! но не хочет. может ещё какие-нибудь отличия имеются? пытался kgp слить - там 64 бит версия. не пошла. Цитата(AHTOXA @ Jan 22 2013, 12:20)  ЗЫ. Если уж совсем не пойдёт, и вы боитесь самодельных сборок сам собирал gcc. просто, как говорится, на ходу коней не меняют. чтоб не отказались остальные проекты работать. а иметь под каждый проект свой компилятор - не айс, да и места не напасёшься. потому вот и хотелось добить. то что это компилятор это понятно. осталось понять как это обойти.
Сообщение отредактировал dezna - Jan 22 2013, 10:17
|
|
|
|
|
Jan 22 2013, 10:24
|

Начинающий профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648

|
Цитата(IgorKossak @ Jan 22 2013, 11:32)  Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет. Так он только С поддерживает, или я не прав? (Programming Languages: C ) P.S. Сам и отвечу: не прав. В сообщении №97 IgorKossak'а указана ссылка в которой присутствуют оба компилятора (проверил архив для linux).
--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
|
|
|
|
|
Jan 22 2013, 10:28
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(IgorKossak @ Jan 22 2013, 12:32)  Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет. спасибо попробую
|
|
|
|
|
Jan 22 2013, 10:57
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(dezna @ Jan 22 2013, 16:11)  но не хочет. может ещё какие-нибудь отличия имеются? Я добросовестно просмотрел весь листинг. Различия на уровне кодогенерации, ничего криминального. Всё, что надо - присутствует, и вызывается. В плане шаманства - попробуйте закомментировать в makefile строчки Код CFLAGS += -ffunction-sections -fdata-sections , Код CXXFLAGS += -ffunction-sections -fdata-sections и Код LD_FLAGS += -Wl,--gc-sections Ну и ещё раз проверьте, что тип процессора, определённый в makefile, соответствует реальному. Цитата(IgorKossak @ Jan 22 2013, 14:32)  Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Я поискал на страничке по ссылке слово "Linaro", и не нашёл. Потом погуглил, и нашёл другую страничку с тулчейном от Linaro  Судя по ответам на первом сайте: Цитата GCC ARM Embedded (call Embedded later) is tuned for Cortex-M/R. Linaro GCC (call Linaro later) is tuned for Cortex-A. Embedded values code size more than performance. Linaro vice versa.
Embedded has a longer release cycle (1 year) and longer maintenance cycle (2 years). Usually no features or optimizations will be added in maintenance period. Linaro has monthly release to follow closely to mainline with latest optimization for newest processors.
Embedded mainly targets bare-metal or RTOS applications. Linaro mainly targets Linux/Andriod kernel/applications. , для нас больше подходит первый вариант. Но он - не Linaro.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jan 22 2013, 11:14
|
Участник

Группа: Участник
Сообщений: 25
Регистрация: 18-03-11
Пользователь №: 63 690

|
Цитата(AHTOXA @ Jan 22 2013, 14:57)  Я добросовестно просмотрел весь листинг. Различия на уровне кодогенерации, ничего криминального. Всё, что надо - присутствует, и вызывается. В плане шаманства - попробуйте закомментировать в makefile строчки это не понадобилось, хоть и попробовал. всё заработало после правки ld скрипта, за что огромное спасибо. всё оказалось гораздо прозаичнее. связано с программатором и каким-то образом с прерываниями (нога BOOT0 к +VCC постоянно). при выключеных прерываниях всё работает, а как разрешаются, то похоже проц переходит на встроенный загрузчик программ. что и происходило. в main() дёргались светодиоды 3 раза, а когда запускалась ось - всё "висло". Цитата(AHTOXA @ Jan 22 2013, 14:57)  для нас больше подходит первый вариант. Но он - не Linaro. скачал первый вариант, попробовал. всё работает, как и на моём (уже). только код он раздувает почти в 2 раза. моим HEX файл - 3725 байт скачаным - 5705 задумался!
|
|
|
|
|
Jan 22 2013, 12:58
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(IgorKossak @ Jan 22 2013, 15:49)  На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу. Это как раз то, что нужно. А я с другого сайта http://www.coocox.org/CoIDE/Compiler_Settings.html, где мне понравилась фраза: Цитата CooCox suggest you to choose ARM GCC as the compiler since it is from ARM official. Выходит что Linaro - под крылом ARM...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Jan 22 2013, 14:04
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(IgorKossak @ Jan 22 2013, 17:49)  На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу. А, теперь всё понятно. Но давайте всё же для однозначности будем называть эту сборку "GCC ARM Embedded", как они сами её называют? Надо затестить её, и, если всё нормально, то использовать её как референсную. А то sourcery g++ lite теперь просто так не скачать, да и вообще будущее её неясно. А тут всё же ARM участвует, солидно
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|