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

 
 
> 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
10 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 99)
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
tamam
сообщение Feb 22 2012, 19:02
Сообщение #16


Участник
*

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



Спасибо, буду разбираться дальше.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Feb 26 2012, 11:55
Сообщение #17


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

Группа: Свой
Сообщений: 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 хорош как база для начала отладки реальной работы.
Потому с них и начал.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
tamam
сообщение Feb 27 2012, 12:46
Сообщение #18


Участник
*

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



Спасибо за оперативность. Разбираюсь....
Go to the top of the page
 
+Quote Post
ReAl
сообщение Mar 1 2012, 14:28
Сообщение #19


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

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



4-Debug уже там же.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
varvar
сообщение Jul 12 2012, 08:29
Сообщение #20


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

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



Товарищи гуру и приближенные к ним!
Помогите решить еще одну чайниковскую проблему - процесс крутится в своем бесконечном цикле, и хотелось бы, чтобы он крутился каждые N циклов системного таймера. Сейчас он делает все задачи и ложится спать на определенное время, но, в связи с тем, что задачи выполняются не каждый раз за одно и то же время - период процесса тоже меняется. Конечно, можно запустить еще один таймер и пусть он генерирует событие, которого процесс и будет ждать, но хотелось бы обойтись системным таймером. Еще один тупой путь - запустить еще один процесс, который только спит, и просыпаясь, генерирует событие для другого процесса. Но как-то это выглядит не кошерно.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Jul 12 2012, 08:54
Сообщение #21


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

Группа: Свой
Сообщений: 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.


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


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

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



Спасибо, когда пояснили, все стало так очевидно! Даже как-то стыдно за вопрос.
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 3 2012, 09:06
Сообщение #23


Участник
*

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



доброго времени днутра или ночера...

есть комплект stm32f0diskovery - требуется откомпилить и запустить какой нибудь из примеров под scmRTOS ..
как я понял примеров пока под cortex-m0 не существует... и ос тоже непонятно работает или нет

ТАК???

помогите пжста чайнику...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 3 2012, 10:53
Сообщение #24


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 3 2012, 12:06) *
есть комплект stm32f0diskovery - требуется откомпилить и запустить какой нибудь из примеров под scmRTOS ..
как я понял примеров пока под cortex-m0 не существует... и ос тоже непонятно работает или нет

ТАК???

Примеров нет, но порт есть: порт для Cortex-M0
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 6 2012, 08:12
Сообщение #25


Участник
*

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



Цитата(_Артём_ @ Aug 3 2012, 11:53) *
Примеров нет, но порт есть: порт для Cortex-M0


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

нет некоторых файлов типа стартап.си... и прочих
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 6 2012, 10:34
Сообщение #26


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 6 2012, 11:12) *
нет некоторых файлов типа стартап.си... и прочих

стартап.си - обычный, только таблица векторов должна быть соответствующей.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 6 2012, 12:58
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 6 2012, 11:12) *
нет некоторых файлов типа стартап.си... и прочих

Update: вспомнил ещё ссылку - там стартап и тп
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 7 2012, 08:06
Сообщение #28


Участник
*

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



Цитата(_Артём_ @ Aug 6 2012, 13:58) *
Update: вспомнил ещё ссылку - там стартап и тп


там для LPC11xx
а stm32f0 нет ...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 7 2012, 09:56
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 7 2012, 11:06) *
там для LPC11xx
а stm32f0 нет ...

Большая разница?
Там и там Cortex-M0.
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 16 2012, 08:57
Сообщение #30


Участник
*

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



Цитата(_Артём_ @ Aug 7 2012, 10:56) *
Большая разница?
Там и там Cortex-M0.


мэй би ес, мэй би ноу....

описание регистров и системных переменных совершенно разное ...
программист как писатель...
захотел назвал так переменную захотел по другому...

может быть различное количество переферии, разные векторы прерываний и прочее...

проект переделал из stm32f2xx отключил кой чего и кой где...

отключил макросы для работы с пинами (pin.h) с шаблонами я пока не очень то разбимрался и не совсем понимаю чего там понаворочали...

проект компилится... хотелось бы наладить связь с разработчиками этой освр для того чтоб допилить по ума этот порт...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 16 2012, 11:39
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 16 2012, 11:57) *
описание регистров и системных переменных совершенно разное ...

Регистры ядра одни и те же?
Какие ещё системные переменные? О чём вы?

Цитата(Посторонним В... @ Aug 16 2012, 11:57) *
может быть различное количество переферии, разные векторы прерываний и прочее...

Стартап нужен соответствующий.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 16 2012, 15:44
Сообщение #32


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

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



Цитата(Посторонним В... @ Aug 16 2012, 14:57) *
хотелось бы наладить связь с разработчиками этой освр для того чтоб допилить по ума этот порт...

Разработчики все здесь, так что, считайте, связалисьsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 21 2012, 03:43
Сообщение #33


Участник
*

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



Цитата(AHTOXA @ Aug 16 2012, 15:44) *
Разработчики все здесь, так что, считайте, связалисьsm.gif


Антон, хотелось бы с вашей помощью "допилить" порт cortex-m0 для stm32f0xx до рабочего состояния...
ну и опубликовать естественно...

сейчас нахожусь на этапе...
sturtup, ld-script, sysinit переписаны... остольное взято с сайта...
с этими файлами перекомпилил и запустил демку для дискавери... (дефолтная)
т.е. файлы вроде как рабочие...

проблема такая...
при запуске системы работает только одна задача - первая...
и не работает функция sleep();

похоже контекст не переключается...
платформо зависимую часть брал из "ветки"
демку и настройки системы взял от stm32f2xx...

как с вами Антон связаться...??? кроме как в форуме ??? думаю работа пошла бы оперативнее..
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Aug 21 2012, 04:07
Сообщение #34


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

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



У вас, похоже, не работает прерывание от системного таймера. Возможно, не совпадает имя обработчика с именем в таблице векторов. Выложите проект сюда, посмотрим, в чём может быть дело.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 21 2012, 05:26
Сообщение #35


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (AHTOXA @ Aug 21 2012, 07:07) *
У вас, похоже, не работает прерывание от системного таймера.
Скорее прерывание переключения контекста.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 21 2012, 06:31
Сообщение #36


Участник
*

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



выкладываю исходники
Прикрепленные файлы
Прикрепленный файл  Test_2012_08_21_08_26_10.7z ( 449.39 килобайт ) Кол-во скачиваний: 46
 
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 21 2012, 20:37
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Посторонним В... @ Aug 21 2012, 09:31) *
выкладываю исходники

Странно, не собирается:
Цитата
./src/main.cpp:47:23: fatal error: stm32f0xx.h: No such file or directory
Go to the top of the page
 
+Quote Post
Посторонним В...
сообщение Aug 22 2012, 04:26
Сообщение #38


Участник
*

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



Цитата(_Артём_ @ Aug 21 2012, 20:37) *
Странно, не собирается:


сори...
надо src и мэйк в папку проекта бросить как у примеров РТОС
ну или мэйк надо немного поправить
Go to the top of the page
 
+Quote Post
varvar
сообщение Sep 6 2012, 18:50
Сообщение #39


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

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



На очередные грабли наступил. В ИАРе для 430 стОит в Library Option для Printf поставить вместо Tiny Large - и та же программа, которая благополучно работала раньше, виснет. Похоже, что-то со стеком. Понятно дело, что float и тем более printf - это не спортивно, но все же... Как бы с этих грабель уйти?
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 6 2012, 20:36
Сообщение #40


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

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



Если подозрение на стек -- увеличить стек для процесса, использующего printf


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
varvar
сообщение Sep 8 2012, 16:17
Сообщение #41


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

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



Цитата(ReAl @ Sep 6 2012, 23:36) *
Если подозрение на стек -- увеличить стек для процесса, использующего printf


Действительно, очевидное решение. И ведь даже увеличивал - но не думал, что надо так сильно увеличить. 500 байт хватило.
Спасибо!
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 3 2012, 02:09
Сообщение #42


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

Группа: Свой
Сообщений: 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

По первой прикидке представляется следующее (в порядке приоритета)
  1. RS485_Slave_Proc - включает в себя обработку прерываний от UART, чтение команды/данных от хоста и соответствующее реагирование на них. Использует channel для передачи и приёма данных в/из DataProcessing_Proc. Длина канала TBD.
  2. DataProcessing_Proc - фактически коммутатор данных между процессами с декодером команд. Формирует необходимые данные для периферии в нужных форматах.
  3. UI_Proc - Обслуживание пользовательского интерфейса. Включает в себя обработку прерываний от SPI. Использует message для передачи кода нажатой кнопки в DataProcessing и channel для передачи отображаемой информации на дисплей. Отображаемая информация пока только текстовая, т.е. этот процесс содержит в себе декодер ASCII в графику.
  4. RS485_Master_Proc - Включает в себя обработку прерываний от UART. Но не для скорости ответа, а для того, чтобы можно было послать запрос и заниматься остальными делами пока не появится ответ. Как вариант, можно и без прерываний, т.е. в одном цикле запросил данные, в следующем - проверил и если есть, то забрал. Использует, скорее всего, message.
  5. LowSpeed_Proc - включает в себя обработку прерываний от RTC (раз в секунду или минуту) и считает время до следующего обслуживания , по данным от DataProcessing включает и выключает реле, по данным от него же выставляет новые значения на PWM, работает с EEPROM, читает АЦП, измеряющее напряжение питания. Передача данных через структурированные мессаджи, т.е. message представляет из себя структуру необходимых данных.

Сразу возникают несколько вопросов:
- Не имеет ли смысла UI_Proc разделить на отдельные процессы работы с кнопками и дисплеем даже при том, что они используют один физический интерфейс?
- Имеет ли смысл вынести в отдельные процессы работу с RTC (редко) и с EEPROM (долго - надо ждать флага). Или просто внутри одного процесса пройти по всей этой периферии, благо всё это медленно? А может и RS485_Master вставить в LowSpeed?
-
Go to the top of the page
 
+Quote Post
dxp
сообщение Oct 4 2012, 04:35
Сообщение #43


Adept
******

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



Никто, кроме вас, не знает, как лучше распределить ресурсы в программе под вашу задачу. Общее правило такое: всё, что не может ждать, помещать в более приоритетные процессы, чем срочнее, тем приоритетнее. Какие там конкретно требования по времянкам, это вам известно, от этого и отталкивайтесь.

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


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


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



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

Но вот вопрос совмещения или разделения кнопок и дисплея в олдном процессе остался. Основное в нём то, что используется один 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. Я прав?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 4 2012, 20:10
Сообщение #45


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Chudik @ Oct 4 2012, 22:31) *
Ага, сейчас понял, что для случая, который я сейчас показал, для SPI должен использоваться Mutex. Я прав?

Ну да. Через mutex обычно и делается.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 4 2012, 21:11
Сообщение #46


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Цитата(_Артём_ @ Oct 4 2012, 13:10) *
Ну да. Через mutex обычно и делается.

Спасибо.
Насколько я понимаю, у тебя есть опыт работы с этой системой. Пока уважаемые авторы системы заняты, может подскажешь по поводу моей структуры. Нормально или что-то изменил бы?
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 4 2012, 23:54
Сообщение #47


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Не нашёл в документации других членов класса process кроме так exec. Это так и должно быть?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 5 2012, 00:35
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 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;
        /// и так далее.....
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 5 2012, 02:17
Сообщение #49


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Ага, спасибо, нашёл в доке.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 5 2012, 14:22
Сообщение #50


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Возможно глупый вопрос: может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 5 2012, 14:27
Сообщение #51


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Chudik @ Oct 5 2012, 17:22) *
может ли mutex быть членом класса или он всегда является внешним по отношению к любым другим объектам?

Конечно может быть и членом класса (экземпляр при этом - глобальная переменная) и глобальной переменной.
Насчёт локальной не знаю, не думал.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 5 2012, 16:41
Сообщение #52


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

Группа: Свой
Сообщений: 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... Очень удобно, спокойно пишу из любого потока.
---
Ой, что-то я поспешил. Это же не локальные объекты, это как раз члены классаsm.gif
Зачем могут понадобиться локальные мутексы - с ходу не придумалось.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 5 2012, 17:03
Сообщение #53


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(AHTOXA @ Oct 5 2012, 19:41) *
Локальной тоже может.

Класс тоже может быть локальной переменной.

Цитата(AHTOXA @ Oct 5 2012, 19:41) *
Зачем могут понадобиться локальные мутексы - с ходу не придумалось.

Говорят глобальные переменные - это плохо, чем их меньше, тем лучше.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 5 2012, 23:59
Сообщение #54


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Цитата(AHTOXA @ Oct 5 2012, 09:41) *
У меня такие мутексы встроены в классы SPI, UART... Очень удобно, спокойно пишу из любого потока.

Вот, вот. На удивление нужно именно это wink.gif
Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?
Дело в том, что в последний раз с С++ я работал лет 15 назад и потому сейчас приходится всё вспоминать по-новой.
При этом тогда это были модели обработки сигналов на РС, которые потом перекидывались в DSP, но обработка уже писалась на соответствующем ассемблере. Т.е. мутексы просто не требовались. Так что не только вспоминать приходится, но и кое-что узнавать.
Ещё хорошо, что с месяц назад поработал на подхвате на проекте с freeRTOS. Вспомнились приёмы работы с RTOS в принципе sm.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 6 2012, 01:03
Сообщение #55


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Chudik @ Oct 6 2012, 02:59) *
Вот, вот. На удивление нужно именно это wink.gif
Можно попросить выложить эти классы и, если нетрудно, фрагменты кода с ними?

А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )?



Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 6 2012, 03:07
Сообщение #56


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Цитата(_Артём_ @ Oct 5 2012, 18:03) *
А чем не устраивают примеры из документации(я про 5.4. OS::TMutex )?

Устраивают, но при отстутствии опыта работы с этой системой написать свои драйвера под неё в грамотном стиле займёт не меньше недели. Если не больше. А если автор системы сможет дать авторский вариант таких драйверов, это сильно упростит дело.
В обмен потом смогу выложить драйвер графического дисплея в текстовом режиме, работающего по этому SPI. И попозже драйвер I2C, созданный по образу и подобию. RS485 на базе того же UART.
Нужна точка опоры sm.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 6 2012, 08:53
Сообщение #57


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

Группа: Свой
Сообщений: 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);



--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 6 2012, 20:25
Сообщение #58


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



AHTOXA
Огромное спасибо! Как раз первое, что я собирался делать - это дисплей через SPI.
У меня уже сделан аналогичный дисплей тоже через SPI для предыдущего проекта без RTOS. Буду теперь соединять двух ёжиков sm.gif Надеюсь, что это не займёт слишком много времени.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 11 2012, 22:54
Сообщение #59


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

Группа: Свой
Сообщений: 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. Надеюсь, что не придётся менять слишком много.

Блин, разрываюсь между тремя проектами: пара хардверных и этот. Скорость написания никакая. sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 12 2012, 03:33
Сообщение #60


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

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



По-моему, вполне. В любом случае, по ходу дела всегда можно что-то подправить/изменить/добавить.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 13 2012, 04:07
Сообщение #61


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

Группа: Свой
Сообщений: 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 функций. И по-моему в конструкторе класса у меня наверняка есть грубые ошибки в синтаксисе, поскольку пишу по остаткам памяти многолетней давности. rolleyes.gif
Массив init приведён просто для референса. С ним как раз более-менее всё понятно. sm.gif
Да, в качестве основы взят найденный на инете драйвер некоего аналогичного графического дисплея, некоторые комментарии не переведены sm.gif

Код
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();
    }
}
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 13 2012, 05:10
Сообщение #62


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

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



Я, честно говоря, не совсем понимаю, что я должен там высмотретьsm.gif
В детали реализации я всё равно вникнуть не смогу, это дело разработчика. Про остальное уже сказал - нормально всё.
Единственное замечание: если у вас шаблон
Код
template<typename cs_pin>
class TDisplay
{
...
, то реализация функций должна быть в том же *.h файле, и выглядеть вот так:
Код
template<typename cs_pin>
void TDisplay<cs_pin>::send_command(uint8_t *data, uint16_t count)
{
...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 13 2012, 18:54
Сообщение #63


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Ну, вот такие замечания и нужны sm.gif Спасибо.
Естественно, я не собираюсь просить смотреть и отлаживать алгоритм. Это я уж сам sm.gif Мне только, чтобы по форме правильно было.

А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр Кроме инлайновских функций, конечно.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 15 2012, 03:26
Сообщение #64


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

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



Цитата(Chudik @ Oct 14 2012, 00:54) *
А почему реализация функций должна быть в файле .h? Я просто привык, что объявление идёт в .h, а описание в файле с тем же именем, но .с или .срр

Так устроены шаблоны. Дело в том, что до того, как шаблону будет передан параметр, компилятор не может знать результирующего типа. То есть, из одного шаблона может получиться куча типов (в нашем случае - по типу на каждую ножку CS). И все эти типы никак не могут поместиться в одном объектном файле.
Короче, лучше про это почитать какую-нибудь книжкуsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 17 2012, 23:45
Сообщение #65


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

Группа: Свой
Сообщений: 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 компилируется. В нём такой ошибки, естественно, не возникает.
Пути для своего проекта скопировал из примера. Где я что-то неправильно сделал?

Можно, конечно, взять пример и наложить на него свой проект, но хотелось бы понять... rolleyes.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 03:30
Сообщение #66


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

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



Я в IAR-е не копенгагенsm.gif


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 18 2012, 05:54
Сообщение #67


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Chudik @ Oct 18 2012, 02:45) *
identifier "namespace" is undefined
говорит о том, что вы пытаетесть C++ заголовочный файл компилировать в режиме C. А это возможно, если вы какой-то из заголовочных файлов ОС (вероятно scmRTOS.h) прямо или косвенно включили в какой-то из файлов с расширением .c


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 18:40
Сообщение #68


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

Группа: Свой
Сообщений: 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 включён в проект. rolleyes.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 18:52
Сообщение #69


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

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



А в файле M3_Terminal.h есть строчка
Код
#include "spi.h"

?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 19:36
Сообщение #70


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

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 18 2012, 19:49
Сообщение #71


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

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



Хм. Странно.
1. Возможно где-то ещё есть объявление типа spi_t.
2. Я не разбираюсь в ИАР-е, но, по моему разумению, включать *.h файлы в проект не надо.
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 18 2012, 21:00
Сообщение #72


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Разобрался, мой косяк был - кросс ссылки на файлы .h sm.gif
Цитата(AHTOXA @ Oct 18 2012, 12:49) *
3. У вас TDisplay используется и в качестве имени шаблона, и в качестве имени шаблонного типа.

в соответствии с http://electronix.ru/forum/index.php?showt...t&p=1099201 wink.gif
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 18 2012, 21:20
Сообщение #73


Гуру
******

Группа: Свой
Сообщений: 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

Кросс ссылки - это что? Не представил...
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 19 2012, 04:54
Сообщение #74


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

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



Цитата(Chudik @ Oct 19 2012, 03:00) *

sm.gif

Цитата(_Артём_ @ Oct 19 2012, 03:20) *
А собственно почему? h-файлы - тоже часть проекта, как и cpp-файлы, поэтому как-то странно их не включать.

Ну это была просто гипотеза. Думал, что раз тип файла определяется не по расширению, а принудительно задан cpp, то, возможно, он компилится как cpp.
Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 19 2012, 20:22
Сообщение #75


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Цитата(AHTOXA @ Oct 18 2012, 21:54) *
Ну и из общих соображений, обязательно добавлять в проект *.c/*.cpp файлы, потому что именно их нужно компилировать. А *.h-файлы - не обязательно.

Угу, именно так.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Oct 19 2012, 23:00
Сообщение #76


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Chudik @ Oct 19 2012, 23:22) *
Угу, именно так.

Это шаблон такой.

Когда в h-файлах содержится значительная часть проекта(шаблоны), то хотелось бы иметь возможность добраться до их содержимого простым кликом мыши.

Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 26 2012, 22:32
Сообщение #77


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

Группа: Свой
Сообщений: 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 */

Но при этом опять возвращается к первой ошибке из указанной здесь.

Посоветуйте, что делать? sad.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 26 2012, 23:21
Сообщение #78


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

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



Это же GCC-шные названия файлов и регистров у меня! Просто подключите IAR-овские, и поправьте несовпадающие названия регистров (типа U0CTL).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 26 2012, 23:57
Сообщение #79


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Логично, конечно.
Сейчас посмотрю. Мне казалось, что они одинаковые... rolleyes.gif

======================
Посмотрел. Регистры совсем другие. Ладно, попробую разобраться.
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 27 2012, 03:18
Сообщение #80


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

Группа: Свой
Сообщений: 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(); }
не помогает

Уфф... тяжко. Надеюсь, что когда проделаю первые шаги дальше будет легче sm.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Oct 27 2012, 05:43
Сообщение #81


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

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



sm.gif
1. spi_base_t - это не шаблонный класс, не надо к нему добавлять "template <spi_num_t>".
2. spi_base_t - это абстрактный класс, нельзя создавать его экземпляры. Замените
typedef spi_base_t<SPI1> TSpi1;
на
typedef spi_t<SPI1> TSpi1;
(Идея spi_base_t в том, чтобы иметь базовый класс для всех реализаций SPI. Мы можем передавать ссылку на него в конструкторы других объектов, которые висят на SPI.)


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Chudik
сообщение Oct 27 2012, 05:53
Сообщение #82


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

Группа: Свой
Сообщений: 197
Регистрация: 31-03-06
Пользователь №: 15 676



Ага, спасибо, поменял. Полегчало. sm.gif
Соотвественно, убрал свои изменения для второй части вопроса.

Теперь уже после того, как эта часть откомпилировалась, буду свой класс дисплея допиливать. sm.gif
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 21 2013, 10:38
Сообщение #83


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 21 2013, 11:10
Сообщение #84


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

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



Светодиоды в 1-EventFlag мигают быстро-быстро, глазом не углядеть. Может быть, в этом дело?
Для проверки попробуйте поменять TProc1::exec() вот на такую:
Код
    OS_PROCESS void TProc1::exec()
    {
        for(;;)
        {
            sleep(500);
            PB0.On();
            sleep(500);
            PB0.Off();
        }
    }


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 21 2013, 11:17
Сообщение #85


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 21 2013, 16:22
Сообщение #86


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

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



В вашем листинге нет упоминания о конструкторах. Похоже, что они не слинковались.
Что за компилятор у вас?
Попробуйте yagarto или kgp. С ними я проверял - работает.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 22 2013, 04:58
Сообщение #87


Участник
*

Группа: Участник
Сообщений: 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 - попробую
но конечно хотелось бы разобраться с моей сборкой. могу куда-нибудь скинуть для проверки.
потому как все остальные проекты то работают.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 22 2013, 05:47
Сообщение #88


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

Группа: Свой
Сообщений: 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))


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 22 2013, 06:21
Сообщение #89


Участник
*

Группа: Участник
Сообщений: 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

помогите пожалуйста добить этот вопрос!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 22 2013, 08:20
Сообщение #90


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

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



Сложно сказать. Листинг практически идентичен моему. init_stack_frame и Default_SystemTimer_ISR - вообще один-в-один.
Должно работать!

ЗЫ. Если уж совсем не пойдёт, и вы боитесь самодельных сборок, то есть Sourcery CodeBench Lite, бывшая sourcery g++ lite. (качать ARM EABI Release).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 22 2013, 08:32
Сообщение #91


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Для сборки под Cortex-Mx пользуюсь тулчейном от Linaro. Нареканий нет.
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 22 2013, 10:11
Сообщение #92


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Jan 22 2013, 10:24
Сообщение #93


Начинающий профессионал
*****

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



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

Так он только С поддерживает, или я не прав?
(Programming Languages: C )

P.S. Сам и отвечу: не прав. В сообщении №97 IgorKossak'а указана ссылка в которой присутствуют оба компилятора (проверил архив для linux).


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 22 2013, 10:28
Сообщение #94


Участник
*

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



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

спасибо попробую
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 22 2013, 10:57
Сообщение #95


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

Группа: Свой
Сообщений: 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 sm.gif
Судя по ответам на первом сайте:
Цитата
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.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dezna
сообщение Jan 22 2013, 11:14
Сообщение #96


Участник
*

Группа: Участник
Сообщений: 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
задумался!
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 22 2013, 11:49
Сообщение #97


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(AHTOXA @ Jan 22 2013, 12:57) *
Я поискал на страничке по ссылке слово "Linaro", и не нашёл.

На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу. Это как раз то, что нужно.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 22 2013, 12:58
Сообщение #98


неотягощённый злом
******

Группа: Свой
Сообщений: 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...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jan 22 2013, 13:26
Сообщение #99


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(demiurg_spb @ Jan 22 2013, 14:58) *
Выходит что Linaro - под крылом ARM...

Где-то в переписке читал, что разработчики Linaro и есть сотрудники ARM.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 22 2013, 14:04
Сообщение #100


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

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



Цитата(IgorKossak @ Jan 22 2013, 17:49) *
На эту ссылку я попал с официального сайта Linaro. В самом низу, в разделе BARE-METAL, вторая снизу.

А, теперь всё понятно. Но давайте всё же для однозначности будем называть эту сборку "GCC ARM Embedded", как они сами её называют?
Надо затестить её, и, если всё нормально, то использовать её как референсную. А то sourcery g++ lite теперь просто так не скачать, да и вообще будущее её неясно.
А тут всё же ARM участвует, солидноsm.gif


--------------------
Если бы я знал, что такое электричество...
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 Текстовая версия Сейчас: 20th July 2025 - 18:28
Рейтинг@Mail.ru


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