scmrtos / scmrtos-sample-projects

MIT License
10 stars 7 forks source link

Serial.print #4

Closed dvv closed 5 years ago

dvv commented 5 years ago

Тестовый код для platformio для maple board (stm32f103c8t6).

#include <Arduino.h>
#include <scmRTOS.h>
#if scmRTOS_IDLE_HOOK_ENABLE
void OS::idle_process_user_hook() { loop(); }
#endif

void setup() {
  Serial.begin(115200);
  // start OS
  // UNLOCK_SYSTEM_TIMER();
  // OS::run();
}

void loop() {
  Serial.print("-");
}

//------------------------------------------------------------------------------

typedef OS::process<OS::pr0, 256> TProc0;
static TProc0 Proc0;

namespace OS
{
  template<> OS_PROCESS void TProc0::exec() {
    for (;;) {
      Serial.print("+");
      OS::sleep(1000);
    }
  }
}

Печатаются минусы в /dev/ttyACM0. После включения OS (раскомментировать в setup), /dev/ttyACM0 пропадает.

Очевидно какой-то стык в использовании системного таймера scmRTOS и stm32duino. Прямое заимствование из здешнего примера не прошло -- отсутствуют определения уже в RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;.

Подскажите пож, как пофиксить?

antongus commented 5 years ago

TIM4 в stm32f103c8t6 есть. Возможно, надо просто подключить нужный заголовочный файл: #include "stm32f10x.h" ? Ну и замечание заодно: если будете печатать в Serial из разных процессов, то желательно обернуть запись в мьютексы. Потому что вряд ли ардуиновский Serial рассчитан на многопоточность.

dvv commented 5 years ago

Дело в том, что такого заголовочного файла нет. Могли бы вы создать тут пример с выводом в USBSerial на базе stm32duino? Спасибо

antongus commented 5 years ago

Файл этот лежит в примерах, в директории common. Также могут понадобиться файлы, которые лежат уровнем выше. Вполне возможно, что и в stm32duino есть этот файл, это стандатрный заголовочный файл от ST. К сожалению, у меня сейчас совсем нет времени разбираться с stm32duino.

dvv commented 5 years ago

Похоже, дело уже было сделано. Но целиком кода найти не могу, а копипаста из того треда не помогает. Читаю

Помогла замена #pragma weak PendSVC_ISR = PendSV_Handler в os_target.cpp на #pragma weak __exc_pendsv = PendSV_Handler

но в os_target.cpp нет PendSVC_ISR.

antongus commented 5 years ago

Вы свой проект сюда приложите, (или куда удобнее), я посмотрю.

Ну и замечание в сторону: "не помогает", "не работает" - не очень информативные описания проблемы. Гораздо полезнее: "компилятор ругается на...", "текст ошибки: ..." :)

antongus commented 5 years ago

Что касаемо PendSVC_ISR - это староне название, его сейчас убрали отовсюду. Сейчас это прерывание занывается PendSV_Handler. Попробуйте в os_target.cpp добавить эту строчку #pragma weak __exc_pendsv = PendSV_Handler

dvv commented 5 years ago

Вы свой проект сюда приложите, (или куда удобнее), я посмотрю.

Готово. Platformio тут.

Спасибо!

antongus commented 5 years ago

Поставил platformio (в виде плагина к vs code), заморгал светодиодиком (у меня плата STM32MINI, с алиэкспресс). Ну, думаю, успех близко. Но не тут то было...

Пытаюсь подцепить scmrtos - не выходит каменный цветок. Сначала не компилировалось - я пытался файлы настройки оси положить в директорию src, а такого сценария не предусмотрено. Хорошо, положил в lib/scmrtos, хотя это и не правильно. Теперь компилируется, но не работает. Как только я пытаюсь задействовать что-то из библиотеки ардуино, сразу компилироваться перестаёт - вылезает ошибка многократного определения функции TIM4_IRQHandler. Оказывается, библиотека ардуины внутри себя определяет все эти вектора, и для их использования надо вызывать какие-то спец. функции. Но это не самое главное. Я дизасемблировал результирующий elf, и там нет функции __exc_pendsv. Почему-то не цепляет. Возможно потому, что она в ассемблерном файле. В общем, дальше надо копать очень глубоко, а мой выходной закончился :) (Вот поэтому не люблю такие комбайны автоматизированные - пока всё работает, они прекрасны. А как только что-то идёт не так, как задумали авторы комбайна, так всё, туши свет. Механизма поправить дело или нет, или он закопан глубоко-глубоко).

antongus commented 5 years ago

Только пожаловался - заработало:) Взял версию scmrtos, в которой обработчик PendSV в cpp файле, отключил custom таймер (с ним почему-то не работает, возможно ардуиновская либа его как-то перенастраивает), вернул SysTick - заработало. По крайней мере, светодиодик мигает из задачи. Остальное не знаю. Где искать выхлоп от Serial.print() - не знаю. USB не энумерируется, в аппаратном USART - тихо. Короче, вот, прикладываю то, что у меня получилось. Если будет развитие - пишите сюда. test1.zip

antongus commented 5 years ago

Во, задышал serial. Я заменил Serial на Serial1, и появились импульсы на PA9. Добавил передачу управления между процессами - работает. В общем, вот: test2.zip. Надеюсь, поможет. (USB-CDC для bluepill и для моего клона не поддерживается, как я понял).

dvv commented 5 years ago

Ага, спасибо! Поправилось (у меня плата со светодиодом на PB1), собралось, залилось, но не замигало ( До-scmrtos-ные проекты собирал с учетом таких определений -- там всё хозяйство на основе libmaple и USBSerial (Serial) рабочий. Очевидно, разные варианты из определений BLUEPILL_F103C8 vs. stm32f1 многое делают по разному.

antongus commented 5 years ago

Думаю, что надо всё же допилить custom таймер. Видимо, systick где-то ещё используется в недрах библиотек. Типа, тайм-ауты отрабатываются и всё такое. Надо просто следовать их правилам, зацепить обработчик таймерного прерывания через TimerHandleInit(), attachIntHandle().

dvv commented 5 years ago

В моей плате зацеплял обработчик сюда.

dvv commented 5 years ago

Успех! USBSerial и моргалка. Спасибо!