27.12.2017, 04:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от -Alan-
|
Сам использую в проекте динамическую память (heap_4.c) и пересылаю указатели на структуру:
struct {
uint8_t DataLength;
uint8_t Data[];
};
Код:
|
dataframe = pvPortMalloc(5);
dataframe-›Length = 4;
dataframe-›Data[0] = Byte0;
dataframe-›Data[1] = Byte1;
...
xQueueSend(q_Main, &dataframe, 0); // Из другого потока, но можно и из прерывания через xQueueSendFromISR
‹...›
while(1) {
if (xQueueReceive(q_Main, &dataframe, 0) == pdPASS ) {
// Действия с данными
vPortFree(dataframe);
};
vTaskDelay(5);
};
Естественно, очередь создаётся так:
q_Main = xQueueCreate(64, sizeof(void *)); // Очередь указателей на данные |
|
А если uint8_t Data[]; превысит больше 4 байт ? Или у вас указано dataframe-›Length = 4; размерность массива uint8_t Data[] ?
Подумываю попробовать ваш метод создание и передачи в очередь структур.
__________________
Глаза боятся,а руки делают.
|
|
|
|
27.12.2017, 11:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,489
Сказал спасибо: 401
Сказали Спасибо 2,216 раз(а) в 1,314 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
С передачей адреса есть такая фишка - по указанному адресу должна существовать актуальная информация на момент ее получения. То есть, задача, в которой хранится эта инфа, не должна удаляться, а инфа не должна быть перезаписана в задаче.
Передача адреса - это конечно красиво, но нарушает принципы многозадачности операционки - нет защищенности информации от изменения.
Копирование в очередь/из очереди основано на атомарном алгоритме memcpy.
Передавать в очереди адрес хорошо только при больших объемах инфы, например буфер графического дисплея, который стопудово всегда существует, и чаще всего он существует не внутри стека задачи, а в области статичных данных, вне кучию
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
27.12.2017, 15:39
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Иногда приходит мысль из того как надо писать на питоне (дзен питона):
Красивое лучше, чем уродливое.
Явное лучше, чем неявное.
Простое лучше, чем сложное.
Сложное лучше, чем запутанное.
Плоское лучше, чем вложенное.
Разреженное лучше, чем плотное.
Читаемость имеет значение.
__________________
Глаза боятся,а руки делают.
|
|
|
|
28.12.2017, 10:54
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от CERGEI1982
|
А если uint8_t Data[]; превысит больше 4 байт ? Или у вас указано dataframe-›Length = 4; размерность массива uint8_t Data[] ?
Подумываю попробовать ваш метод создание и передачи в очередь структур.
|
Размер структуры, которая помещается в память - расчитывается предварительно. Типов сообщений пока не так много, чтобы запутаться.
Реально - заполнение происходит подобным образом:
PHP код:
|
uint8_t tmp_buffer[32];
uint8_t i;
‹...›
i = 0;
(указатель-на-структуру)tmp_buffer[i++] = data;
(указатель-на-структуру)tmp_buffer[i++] = data;
(указатель-на-структуру)tmp_buffer[i++] = data;
‹...›
frame = pvPortMalloc(i);
‹...›
(Копирование данных в кучу)
(Отправка укзателя в очередь)
|
То есть, фактически копирование - одно. Только после выделения необходимого количества памяти. После - только чтение и обработка по указателю, в который был скопирован переданый указатель.
|
|
|
|
02.01.2018, 08:31
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
При отладке в кейле уходит в осадок программа на HardFault_Handler при передачи из прерывания семафора.
Создание семафора:
PHP код:
|
// semafor test xSemaforTest=xSemaphoreCreateBinary(); if(xSemaforTest==NULL) { while(1) error_semafor=1; }
|
Прерывание
PHP код:
|
void RTC_IRQHandler(void) { if(RTC-›CRL & RTC_CRL_SECF) { //------------------------------------------- static BaseType_t xHigherPriorityTaskWoken; //------------------------------------------- RTC-›CRL &= ~RTC_CRL_SECF;
xHigherPriorityTaskWoken = pdFALSE; xSemaphoreGiveFromISR(xSemaforTest, &xHigherPriorityTaskWoken); /* There are no transmissions in progress, so no tasks to notify. */ //xTaskToNotify = NULL; portEND_SWITCHING_ISR(xHigherPriorityTaskWoken); } }
|
При заливки кода все работает корректно,без отладчика.
Использую ST-Link V2 прошитый в J-Link
__________________
Глаза боятся,а руки делают.
|
|
|
|
02.01.2018, 16:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Проблема решена.
Виноват сам.
В прерывании отправляю семафор,но включаю прерывание еще не создав семафора. Перенес включение прерывание в задачу где работает с семафором и все встало на свои места. Очень познавательно
__________________
Глаза боятся,а руки делают.
|
|
|
|
02.01.2018, 18:17
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
У меня была аналогичная ситуация, где:
1. RTOS инициализируется после настройки периферии и разрешения прерываний.
2. Данные из (конкретно) UART'а - основной консоли для диагностики, принимаются в прерывании и складываются в очередь.
3. Если в момент между инициализацией периферии и запуском RTOS придёт байт из консоли - вылетаем в HardFault по причине использования нулевого указателя.
Решилось отложеным разрешением чтения данных из консоли.
|
|
|
|
18.01.2018, 17:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Трассировку кто пробовал с помощью Tracealyzer for FreeRTOS ?
Установил,только вот не понял есть ли там бесплатная регистрация и какие ограничения.
__________________
Глаза боятся,а руки делают.
|
|
|
|
09.03.2018, 12:15
|
|
Частый гость
Регистрация: 03.05.2017
Сообщений: 32
Сказал спасибо: 3
Сказали Спасибо 1 раз в 1 сообщении
|
Re: FreeRTOS?? Разобраться с демо проектом??
Добрый день. Прошу хэлпа. Никак не удается подружить FreeRtos с проектом. Делаю все по инструкции: подключаю файлы из распакованного архива к проекту, прописываю пути. Создаю задачу - зажечь светодиоды на discovery. При компиляции нет ошибок, предупреждений, но и светодиоды не загораются...Вначале ругался на отсутствие некоторых функций, сделал заглушки.
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "freeRTOS.h"
#include "task.h"
#include "FreeRTOSConfig.h"
#define LedOn GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15)
#define LedOff GPIO_ResetBits(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)
void vPortEnableVFP( void ){} //-------------------------
void vPortStartFirstTask( void ){}
void vApplicationTickHook( void ){} // заглушки
void vApplicationMallocFailedHook( void ){}
void vApplicationIdleHook( void ){} //--------------------
void GPIOinit();
void LedTask(void* pvParameters)
{
while(1)
{
LedOn;
}
}
void main(void)
{
GPIOinit();
xTaskCreate(LedTask, "LedBlink", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, NULL);
vTaskStartScheduler();
while(1)
{
}
}
void GPIOinit()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
|
|
|
|
09.03.2018, 13:47
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Задержку поставьте обязательно vTaskDelay
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:41.
|
|