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

 
 
10 страниц V  « < 7 8 9 10 >  
Reply to this topicStart new topic
> scmRtos для медных чайников
AHTOXA
сообщение Dec 11 2015, 09:43
Сообщение #121


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

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



Цитата(dxp @ Dec 11 2015, 13:10) *
std::vector<int> my_vector;
my_vector тоже находится в пространстве имён std. Так?

Переменная my_vector - нет. Функция my_vector::size() - да.

Вот ещё ссылка в тему.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
uriy
сообщение Dec 11 2015, 12:04
Сообщение #122


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
Т.е. подозреваете банальный (и подлый) memory overwrite при пересылке данных?
Так и оказалось.
При инициализации DMA указал количество элементов как sizeof(adc_buf), а adc_buf состоит из 12 элементов 2 байтовых.
В итоге sizeof(adc_buf) возвращало вдвое больше чем я хотел передать и данные писались поверх других переменных.

Уже не первый раз на этом попадаюсь
Go to the top of the page
 
+Quote Post
varvar
сообщение Apr 16 2016, 17:36
Сообщение #123


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

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



Опять туплю. На сей раз процессор STM32F103, компилятор GCC, версия scmRTOS 5, если это имеет значение.
Прерывание:
Код
OS::channel<uint8_t, 32> UsartRxChannel;
....
extern "C" void USART1_IRQHandler(void)
{
  if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  {
    uint8_t c;
    c = USART1->DR;
    if (UsartRxChannel.get_free_size()>0) UsartRxChannel.push(c);    
  }
}

Как только доходит первый раз до UsartRxChannel.push( c ) - все улетает неведомо куда и прерывания больше не случаются.
При использовании TEventFlag signal_isr() никаких странностей не наблюдается, но делать свой буфер, когда есть channel как-то не кошерно sm.gif .
Не подскажете, что я делаю не так?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 16 2016, 18:48
Сообщение #124


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

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



Цитата(varvar @ Apr 16 2016, 22:36) *
Не подскажете, что я делаю не так?

При использовании сервисов оси в прерываниях обязательно нужно объявлять в обработчике прерывания переменную типа OS::TISRW:
Код
extern "C" void USART1_IRQHandler(void)
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        OS::TISRW ISR;
...

Она обеспечивает перепланировку при выходе из зоны видимости.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
varvar
сообщение Apr 16 2016, 19:15
Сообщение #125


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

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



Цитата(AHTOXA @ Apr 16 2016, 21:48) *
При использовании сервисов оси в прерываниях обязательно нужно объявлять в обработчике прерывания переменную типа OS::TISRW:
Она обеспечивает перепланировку при выходе из зоны видимости.


Спасибо огромное - похоже, у меня склероз крепчает - ведь в старых проектах у меня она везде есть!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 16 2016, 19:57
Сообщение #126


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

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



Насколько я могу сейчас сообразить, это не должно приводить к зависанию. Просто перепланировка будет происходить по прерыванию системного таймера. Скорее всего тут ещё наложилось то, что вы не обрабатываете флаг переполнения UART. Если мне не изменяет память, он сбрасывается последовательным чтением регистра статуса и регистра данных. А в вашем обработчике при отсутствии флага RXNE чтение регистра данных не производится. Чтобы избежать таких ситуаций я делаю вот так:
Код
{
    auto status = USART1->SR;
    auto data = USART1->DR;

    if (status & USART_FLAG_RXNE)
    {
        if (rxChannel_.get_free_size())
            rxChannel_.push(data);
    }
...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
varvar
сообщение Apr 17 2016, 09:12
Сообщение #127


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

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



Цитата(AHTOXA @ Apr 16 2016, 22:57) *
Насколько я могу сейчас сообразить, это не должно приводить к зависанию.

Что-то не выходит каменный цветок - вроде как заработало, через несколько десятков секунд опять виснет. Пока оставил следующее решение - работает без вопросов:
CODE
struct sFifo
{
uint8_t buf[128];
uint8_t tail;
uint8_t head;
uint8_t MsgSize;
};
sFifo usartRXfifo;
OS::TEventFlag GpsFlag;
extern "C" void USART1_IRQHandler(void)
{
OS::TISRW ISR;
auto status = USART1->SR;
auto data = USART1->DR;
if (status & USART_FLAG_RXNE)
{
if((usartRXfifo.head-usartRXfifo.tail)!=128)
{
usartRXfifo.buf[usartRXfifo.head & 0x7F]=data;
usartRXfifo.head++;
}
if (data=='\r')
{
usartRXfifo.MsgSize = usartRXfifo.head-usartRXfifo.tail;
GpsFlag.signal_isr();
}
}
}


Может, с другими задачами чего поделить не может - в системе еще IMU крутится и данные в CAN выплевывает.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 17 2016, 11:20
Сообщение #128


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

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



Вы тогда уж засуньте создание OS::TISRW в ту ветку, где взводится флажок GpsFlag. А то ваш нынешний код всё равно дёргает перепланировку на каждый принятый символ.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 17 2016, 13:51
Сообщение #129


Adept
******

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



QUOTE (varvar @ Apr 17 2016, 15:12) *
Что-то не выходит каменный цветок - вроде как заработало, через несколько десятков секунд опять виснет.

А уверены, что channel не переполняется? Если в нём нет места, то будет предпринята попытка встать на ожидание, что в прерывании приведёт к фатальным результатам.


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


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

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



Цитата(dxp @ Apr 17 2016, 16:51) *
А уверены, что channel не переполняется?

Он с большим запасом вроде как, и, кроме того, я проверяю перед записью, есть ли там место get_free_size. Короче, мистика какая-то.
Go to the top of the page
 
+Quote Post
Anatoly74
сообщение May 12 2016, 12:26
Сообщение #131





Группа: Участник
Сообщений: 10
Регистрация: 28-10-10
Пользователь №: 60 480



Необходимо написать "мягкий" вариант критической секции, когда прерывания разрешены, но заблокирована работа планировщика, чтобы не было переключения процессов.
Вопрос. В какой п/программе Оси лучше сделать блокировку планировщика?

Сообщение отредактировал Anatoly74 - May 12 2016, 13:00
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 12 2016, 13:39
Сообщение #132


Гуру
******

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



QUOTE (Anatoly74 @ May 12 2016, 15:26) *
В какой п/программе Оси лучше сделать блокировку планировщика?
Начиная с версии 4 в ОС есть класс TKernelAgent. Он предназначен для написания расширений. Отнаследуйтесь от него и творите в наследнике что хотите. Когда напишете - расскажите, что у вас получилось. Помнится, такой вопрос уже обсуждался и никакого решения мы не нашли.


--------------------
На любой вопрос даю любой ответ
"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
Anatoly74
сообщение May 12 2016, 16:57
Сообщение #133





Группа: Участник
Сообщений: 10
Регистрация: 28-10-10
Пользователь №: 60 480



Спасибо за наводку
Go to the top of the page
 
+Quote Post
varvar
сообщение Jun 10 2018, 08:27
Сообщение #134


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

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



Опять туплю.
Пытаюсь заставить работать scmRTOS c STM32F103C8 (платка Blue Pill, операционная система должна работать поверх STM32duino)
В качестве системного таймера пытаюсь использовать TIMER3:


CODE

// If the macro value is 0 (the default), the port uses SysTick as a system
// timer. It initializes the timer and starts it. The user must make sure that
// the address of the timer interrupt handler (SysTick_Handler) is in the right
// place at the interrupt vector table.
// If the macro value is 1, then the user has to implement (see docs for details):
// 1. extern "C" void __init_system_timer();
// 2. void LOCK_SYSTEM_TIMER() / void UNLOCK_SYSTEM_TIMER();
// 3. In the interrupt handler of the custom timer, the user needs to call
// OS::system_timer_isr()

#if SCMRTOS_USE_CUSTOM_TIMER == 1

static void TIM3_Event()
{
OS::system_timer_isr();
}

extern "C" void __init_system_timer()
{
RCC_BASE->APB1ENR |= RCC_APB1ENR_TIM3EN; // TIM3
// TIM3 master counter period 1 msec 48MHz main
TIMER3->regs.gen->CR1 &= ~TIMER_CR1_CEN; // disabled
TIMER3->regs.gen->PSC = 480 - 1; //new clock = 100kHz
TIMER3->regs.gen->ARR = 100 - 1; //period = 16usec
TIMER3->regs.gen->CR1 |= TIMER_CR1_DIR; //used as downcounter
timer_attach_interrupt(TIMER3, TIMER_UPDATE_INTERRUPT, TIM3_Event);
TIMER3->regs.gen->CR1 |= TIMER_CR1_CEN; // enable timer
TIMER3->regs.gen->DIER |= TIMER_DIER_UIE; //enable interrupt
}

INLINE void LOCK_SYSTEM_TIMER()
{
TIMER3->regs.gen->CR1 &= ~TIMER_CR1_CEN; // disable timer
}

INLINE void UNLOCK_SYSTEM_TIMER()
{
TIMER3->regs.gen->CR1 |= TIMER_CR1_CEN; // enable timer
}


#endif


после первого же вызова OS::sleep() прерывание больше не наблюдается.
Что я опять делаю не так?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jun 10 2018, 09:18
Сообщение #135


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

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



Прерывание вызывается?
А приоритет какой у него?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 07:11
Рейтинг@Mail.ru


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