реклама на сайте
подробности

 
 
10 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> scmRtos для медных чайников
varvar
сообщение Feb 12 2012, 09:04
Сообщение #1


Частый гость
**

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



Добрый день всем!
Возникло желание - точнее, необходимось использовать многозадачность в своем проекте - вернее, или надо писать свой диспетчер (в котором я уже успел запутаться), или пользоваться чем-то готовым.
Увидел scmRtos - попытался запустить демку. Пример под IAR на MSP430F2617 - у меня на плате MSP430F2410, IAR версия 5.30

Немножко подправил демку под свою плату, чтобы нужный светодиодик моргал, указал иару на MSP430F2410 - и ничего. WDT прерывание случается раза 4 (вроде как это системный таймер?), после чего программа улетает неведомо куда.

Кто-нибудь может на путь истинный наставить - что можно трогать, что нельзя. Может ли на работоспособности версия компилятора сказаться? Или, лучше всего, может у кого готовая рыба завалялась для моргания именно на этом кристалле или похожем?
Go to the top of the page
 
+Quote Post
varvar
сообщение Feb 12 2012, 14:56
Сообщение #2


Частый гость
**

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



Ok, кажется загрузка новой версии (4.0) немного помогла.
Но моргалка здесь сигнал выдает какой-то совсем не похожий на периодический

context_switcher_isr:
save_regs
mov.w SP,r12
XOR.B #0x2, &0x21 // blinking led
xcall #os_context_switch_hook
mov.w r12,SP
l_restore_context:
restore_regs
reti
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 12 2012, 16:34
Сообщение #3


Adept
******

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



QUOTE (varvar @ Feb 12 2012, 21:56) *
Ok, кажется загрузка новой версии (4.0) немного помогла.
Но моргалка здесь сигнал выдает какой-то совсем не похожий на периодический

context_switcher_isr:
save_regs
mov.w SP,r12
XOR.B #0x2, &0x21 // blinking led
xcall #os_context_switch_hook
mov.w r12,SP
l_restore_context:
restore_regs
reti

А зачем вы в самые недра ядра-то полезли? Это не место для пользовательского кода. И с чего взяли, что тут должен быть периодический сигнал? Вы документацию-то читали? Используйте для формирования таких сигналов пользовательские процессы и функцию sleep().


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
varvar
сообщение Feb 12 2012, 18:11
Сообщение #4


Частый гость
**

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



Цитата(dxp @ Feb 12 2012, 19:34) *
А зачем вы в самые недра ядра-то полезли? Это не место для пользовательского кода. И с чего взяли, что тут должен быть периодический сигнал? Вы документацию-то читали? Используйте для формирования таких сигналов пользовательские процессы и функцию sleep().


так не работало вообще ничего - надо ж как-то определяться было. Я ж предупреждал - чайник медный sm.gif Я понимаю, что коду там не место - но как-то понять, работает или нет надо было.
Насчет документации - грешен, не читал еще. Определить работоспособность пытался по аналогии с FreeRtos - там системный таймер похожим образом сделан. Спасибо за подсказку.
Подход может быть и тупой - но просто хотелось убедиться, что элементарный готовый пример будет на моем железе и с моим компилятором работать - а потом уже разбираться.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 13 2012, 06:27
Сообщение #5


Adept
******

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



QUOTE (varvar @ Feb 13 2012, 01:11) *
так не работало вообще ничего

И примеры из комплекта тоже не работали?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
varvar
сообщение Feb 13 2012, 16:17
Сообщение #6


Частый гость
**

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



Я с примеров и начинал - с моей версией ИАРа и 3.10 версией scmRtos программа улетала непонятно куда - по крайней мере кода в той области, где я ее останавливал, не было. 4-ая версия работает - по крайней мере, и демки, и мои попытки их модификаций. Самое время начать читать документацию. Кстати, у тексаса не увидел никаких упоминаний о Вашей операционной системе. Они не знают о ней или игнорируют? Или я плохо искал?

Сообщение отредактировал varvar - Feb 13 2012, 16:18
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 14 2012, 03:52
Сообщение #7


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) в виде тулчейна и своей собственной операционки.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
varvar
сообщение Feb 14 2012, 20:04
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 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 остановив задачу или все-таки где-то в самой задаче это делать?

Если вопросы слишком наивные - как медный чайник, обещаю обзавестись свистком sm.gif

А вообще - Ваша документация описывает все, но вот из нее бы выжимку для чайников сделать, без полного описания что и как работает.
Типа - делай так - и вот тебе пример. Тем более, у большинства начинающих пользоваться и вопросы возникают практически одинаковые.
А пока читаешь полную документацию, дойдя до середины, уже забудешь, что было в начале.
Такая подробная нужна уже тогда, когда элементарные вещи делаешь без проблем и нужны уже тонкости.
А для начала бы список функций с кратким пояснением на пару страниц - или в качестве приложения к документации.

P.S.

по второму вопросу - видимо, нужны channel и я плохо смотрел приметы?

Сообщение отредактировал varvar - Feb 14 2012, 20:06
Go to the top of the page
 
+Quote Post
a9d
сообщение Feb 14 2012, 20:48
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 312
Регистрация: 9-04-10
Пользователь №: 56 532



Почитай статьи по потокам. Это фактически тоже самое.

Также статьи по использованию scmRTOS существуют. И там и рассказано, что и как инициализировать/использовать.
Go to the top of the page
 
+Quote Post
dxp
сообщение Feb 15 2012, 05:04
Сообщение #10


Adept
******

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



1. В процессе ждать флаг события от таймера, когда флаг просигнален, отправить в SPI. Тут если скорость SPI высокая, а МК не очень быстрый, то, возможно, имеет смысл не заморачиваться с прерываниями, а просто поллить флаг окончания передачи - с переходами в другие процессы может получиться тормознее и накладнее. Если скорость SPI медленная по сравнению с темпом выполнения инструкций процессора, то просто после инициирования отправки в этом же процессе ждать другого флага событий, который просигналит уже обработчик прерывания передатчика SPI. Дождались, пошли дальше - теперь ждём, как я понял, данных от приёмника, но ждём не вечно, а в течении какого-то времени и ждём не просто события, а данных. Поэтому тут логично было бы использовать OS::message<> - создать объект-сообщение для ожидаемого типа и ждать его с таймаутом. Пришли данные до истечения таймаута - одни действия, таймаут истёк - другие. Весь код получается простой и линейный в одном процессе.

2. Да, OS::channel<> вполне нормально подходит. Но, возможно, пойдёт и просто кольцевой буфер - зависит от приложения, от того, какие источники и как они обращаются к буферу передатчика. Возможно, проще будет использовать кольцевой буфер с критическими секциями. Но и канал тоже нормально подходит, единственное, надо следить, чтобы в ISR передатчика канал не пытался встать на ожидание, т.е. надо следить за тем, что обработчике прерываний перед извлечением из канала очередного элемента канал не пуст. Иначе он будет вставать в ожидание с попыткой отдать управление ядру, а это чревато негативными последствиями.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
tamam
сообщение Feb 22 2012, 06:18
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2012, 08:05
Сообщение #12


Нечётный пользователь.
******

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



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

Если забуду — постучите завтра в личку, мне на почту уведомление придёт.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 22 2012, 08:10
Сообщение #13


фанат дивана
******

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



Цитата(tamam @ Feb 22 2012, 12:18) *
За основу взял GCC пример для STM EventFlag.

Ага. И первым делом вписал свой копирайт в мой мейкфайлsm.gif
Вообще-то так не делается.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
tamam
сообщение Feb 22 2012, 09:12
Сообщение #14


Участник
*

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



Цитата(AHTOXA @ Feb 22 2012, 12:10) *
Ага. И первым делом вписал свой копирайт в мой мейкфайлsm.gif
Вообще-то так не делается.


Виноват, Обидеть не хотел. blush.gif

Я его сначала начал сам писать и конкретно запарился, а потом взял за основу Ваш.

Но пока разбирался, было не до копирайта.

Только переползаю на GCC.

Исправил.

Сообщение отредактировал tamam - Feb 22 2012, 09:38
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 22 2012, 17:55
Сообщение #15


Нечётный пользователь.
******

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



Цитата(ReAl @ Feb 22 2012, 10:05) *
Если забуду — постучите завтра в личку, мне на почту уведомление придёт.
Сам вспомнил :-)
Но все равно откладывается. Там хоть и примеры, но много завязано на конкретную мою плату и уже почикано под пробу конкретных моих заморочек.

На работе есть плата SK_MLPC1768, я на ней подниму примеры, вычищу лишнее, тогда можно будет показать.
Для начала 1-EventFlag, он по сравнению с STM32-шным уже изменён. Приведён в соответствие с avr-gcc-шным.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

10 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 05:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01526 секунд с 7
ELECTRONIX ©2004-2016