19.12.2017, 17:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Значение, хранящееся в дескрипторе задачи - указывает на адрес начала блока TCB, который распространяется в сторону увеличения адресов ОЗУ. А стек задачи распространяется в обратном направлении, в сторону уменьшения адресов, начиная от начала TCB. Чтобы увидеть стек задачи vTask1, вам надо смотреть выше. По сути, на ваших скрине в ANSI-коде вы видите блок TCB задачи 1, ниже по картинке - стек задачи 2, и под ним - блок TCB задачи 2. Адреса у вас увеличиваются вниз по картинке.
От адреса 0x200002B0 отсчитайте вверх по картинке 128*4 = 512 байт - и вы увидите границу стека задачи - её адрес 0x2000 00B0, как раз на 0х200 меньше. Так же, когда читаете байты, не забывайте, что 4-хбайтные слова в памяти хранятся в формате Little Endian, то есть, младший байт слова помещается левее по картинке, в ячейке с меньшим адресом. То есть читать 4-хбайтовой слово надо побайтно-зеркально. На скрине показал наглядно.
__________________
Глаза боятся,а руки делают.
|
|
|
|
22.12.2017, 05:55
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
С FreeRTOS+Trace кто нибудь пробовал пользоваться? Смотрю там напрямую с j-link можно работать, правда три версии там есть. Цены не смотрел, но есть бесплатная версия анализатора.
https://freertos.org/FreeRTOS-Plus/F...us_Trace.shtml
__________________
Глаза боятся,а руки делают.
|
|
|
|
24.12.2017, 10:57
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Глюк что ли?
Создаю очередь и задачу которая принимает сообщение из прерывания.Структура с двумя переменными
PHP код:
|
typedef struct xQueue_t {
long lText;
long cID;
} xQueue_s,*pxQueue_s;
|
и вторую переменную задача не видит cID, меняю ее тип на char и тогда есть передача переменной. При том что первая переменная iText в любом типе работает корректно.
Весь код,кроме инициализации таймера
PHP код:
|
#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include ‹stdlib.h›
#include ‹stdio.h›
#include ‹string.h›
#include "queue.h"
#include "semphr.h"
#include "init_hard.h"
volatile unsigned long ulIdleCycleCount = 0;
/*** descript RTOS ***/
TaskHandle_t xTask1_Handle,
xTask2_Handle;
QueueHandle_t xQueue;
SemaphoreHandle_t xSemaforTest;
//================================================== =========================
// struct queue
typedef struct xQueue_t {
long lText;
long cID;
} xQueue_s,*pxQueue_s;
xQueue_s xTP1, xTP2;
/*-----------------------------------------------------------*/
void vTaskResept( void *pvParametrs);
void vTaskSend( void *pvParametrs);
void init_(void);
/////////////////////////////////////////////////////////////
// INT
void TIM2_IRQHandler (void)
{
if(TIM2-›SR & TIM_SR_UIF)
{
//-------------------------------------------
static BaseType_t xHigherPriorityTaskWoken;
static xQueue_s xInt;
char err;
//-------------------------------------------
TIM2-›SR &= ~TIM_SR_UIF;
xHigherPriorityTaskWoken = pdFALSE;
//-------------------------------------------------
xInt.cID=1; // id preriv
xInt.lText+=5;
if(xInt.lText›=254)
xInt.lText=0;
if(xQueueSendToBackFromISR( xQueue,&xInt,&xHigherPriorityTaskWoken ) != pdPASS)
{ err=1;}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
}
//////////////////////////////////////////////////////////
// MAIN
int main( void )
{
char error_queue,error_semafor;
// init_hard
init_();
//Queue
xQueue = xQueueCreate(5, sizeof( struct xQueue_s * ));
// error queue
if( xQueue == 0 )
{
while(1) error_queue=1;
}
// Task
xTaskCreate( vTaskResept,
( const char * ) "TaskResept",
configMINIMAL_STACK_SIZE,
(void*)2,
3,
&xTask1_Handle );
xTaskCreate( vTaskSend,
( const char * ) "TaskSend",
configMINIMAL_STACK_SIZE,
NULL,
2,
&xTask2_Handle );
//xTP1.period=sizeof(tskTCB);
vTaskStartScheduler();
// error
while (1) { }
}
////////////////////////////////////////////////////////////////////
// TASK
void vTaskResept( void *pvParameters )
{
//-----------------------------------------------------------
xQueue_s xRxedMessage;
portBASE_TYPE xStatus;
//xRxedMessage.lText=(long) pvParameters;
//-------------------------------------------------------
for( ;; )
{
xStatus = xQueueReceive(xQueue, &xRxedMessage, portMAX_DELAY);
GPIOC-›ODR ^= GPIO_ODR_ODR13;
vTaskDelay(xRxedMessage.lText/portTICK_PERIOD_MS);
}
//vTaskDelete( NULL );
}
//////////////////////////////////////////////////////////////////////
// TASK
void vTaskSend( void *pvParameters )
{
long temp2[20];
//------------------------------------------------
struct TaskParam_t *pxMessage;
portBASE_TYPE xStatus;
//-------------------------------------------------
for( ;; )
{
// xTP2.lText++;
// if(xTP2.lText › 253) xTP2.lText=0;
// xTP2.cID=23;
// xQueueSend(xQueue, &xTP2, 0);
vTaskDelay(100/portTICK_PERIOD_MS);
}
//vTaskDelete( NULL );
}
|
__________________
Глаза боятся,а руки делают.
|
|
|
|
24.12.2017, 15:02
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Кажется мне, что Вы создаёте очередь с размером элемента в [Размер указателя]. Последняя звёздочка.
Сам использую в проекте динамическую память (heap_4.c) и пересылаю указатели на структуру:
struct {
uint8_t DataLength;
uint8_t Data[];
};
Соответственно, указатель - всегда 4 байта (Cortex-M4), а фактически памяти может быть выделено значительно больше. Плюс уменьшается количество копирований/вставок.
Работает всё таким образом:
Код:
|
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 *)); // Очередь указателей на данные |
Попробуйте заменить
Код:
|
//Queue
xQueue = xQueueCreate(5, sizeof( struct xQueue_s * )); |
На
Код:
|
//Queue
xQueue = xQueueCreate(5, sizeof( struct xQueue_s)); |
Последний раз редактировалось -Alan-; 24.12.2017 в 15:05.
Причина: Потерял скобку цикла
|
|
|
|
25.12.2017, 06:30
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от -Alan-
|
Попробуйте заменить
Код:
|
//Queue
xQueue = xQueueCreate(5, sizeof( struct xQueue_s * )); |
На
Код:
|
//Queue
xQueue = xQueueCreate(5, sizeof( struct xQueue_s)); |
|
Обижается,пишет что не может sizeof узнать размер структуры.
__________________
Глаза боятся,а руки делают.
|
|
|
|
25.12.2017, 06:34
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от -Alan-
|
Кажется мне, что Вы создаёте очередь с размером элемента в [Размер указателя]. Последняя звёздочка.
Сам использую в проекте динамическую память (heap_4.c) и пересылаю указатели на структуру:
struct {
uint8_t DataLength;
uint8_t Data[];
};
Соответственно, указатель - всегда 4 байта (Cortex-M4), а фактически памяти может быть выделено значительно больше. Плюс уменьшается количество копирований/вставок.
Работает всё таким образом:
Код:
|
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 *)); // Очередь указателей на данные |
|
Получается вы создаете очередь без указания размера ячейки очереди и уже во время xQueueSend выделяет память зная что
Код:
|
dataframe = pvPortMalloc(5); |
А вот pvPortMalloc(5) это 5 штук long ?
Геморройно вручную выделять нужный размер памяти под структуру конечно,мне так кажется.
__________________
Глаза боятся,а руки делают.
|
|
|
|
26.12.2017, 12:59
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
FreeRtos тож не панацея,особенно при применении мьютексов и инверсии приоритетов.
__________________
Глаза боятся,а руки делают.
|
|
|
|
26.12.2017, 15:40
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от CERGEI1982
|
Получается вы создаете очередь без указания размера ячейки очереди
|
Нет. Размер ячейки очереди будет равен размеру указателя на void (ЛЮБОГО указателя в данном примере). В моём случае (Cortex-M4) - это 4 байта). Эквивалентно xQueueCreate(64, 4); но плохо переносится между архитектурами.
Сообщение от CERGEI1982
|
Код:
|
dataframe = pvPortMalloc(5); |
А вот pvPortMalloc(5) это 5 штук long ?
|
Нет, здесь просьба выделить 5 байт. Любой malloc работает с байтами.
Сообщение от CERGEI1982
|
Геморройно вручную выделять нужный размер памяти под структуру конечно,мне так кажется.
|
На самом деле - нет. Просто там я уже заранее знаю, какой размер данных будет сложен в память.
И, да, забыл убрать слово "struct". Должно сработать так:
xQueue = xQueueCreate(5, sizeof(xQueue_s));
У меня:
PHP код:
|
typedef struct QueuePtrPacket { uint8_t Length; // Message length uint8_t Data[]; // Message data (variable) } __attribute__ ((packed)) QueuePtrPacket_t; // __attribute__ ((packed)) // Не выравнивать запись пустыми байтами по границе 4 байт
|
Последний раз редактировалось -Alan-; 26.12.2017 в 15:46.
Причина: Форматирование
|
|
|
|
26.12.2017, 16:28
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Все очень просто - каждый элемент очереди - размером всего в 4 байта, а элементов - 5. За один раз (за одну посылку) в очередь отправляется только один элемент, размером в 4 байта.
Это я относительно первого варианта кода
|
|
|
|
27.12.2017, 03:53
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: FreeRTOS?? Разобраться с демо проектом??
Сообщение от -Alan-
|
И, да, забыл убрать слово "struct". Должно сработать так:
xQueue = xQueueCreate(5, sizeof(xQueue_s));
|
Спасибо,сработало так.
Конечно хотелось бы передавать указателем,а не копировать все данные в очередь и обратно.
Но пока изучаю основы,в процессе применения бум экспериментировать.
Смотрю и в кубе есть freertos, с графической настройкой параметров.
Для чего это все,хал и куб с freertos,когда и так все понятно.Может хотели аналог ардуины,без знания регистров.
__________________
Глаза боятся,а руки делают.
Последний раз редактировалось CERGEI1982; 27.12.2017 в 04:35.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 02:13.
|
|