Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

FreeRTOS?? Разобраться с демо проектом??

Непрочитано 19.12.2017, 17:52  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

Значение, хранящееся в дескрипторе задачи - указывает на адрес начала блока TCB, который распространяется в сторону увеличения адресов ОЗУ. А стек задачи распространяется в обратном направлении, в сторону уменьшения адресов, начиная от начала TCB. Чтобы увидеть стек задачи vTask1, вам надо смотреть выше. По сути, на ваших скрине в ANSI-коде вы видите блок TCB задачи 1, ниже по картинке - стек задачи 2, и под ним - блок TCB задачи 2. Адреса у вас увеличиваются вниз по картинке.
От адреса 0x200002B0 отсчитайте вверх по картинке 128*4 = 512 байт - и вы увидите границу стека задачи - её адрес 0x2000 00B0, как раз на 0х200 меньше. Так же, когда читаете байты, не забывайте, что 4-хбайтные слова в памяти хранятся в формате Little Endian, то есть, младший байт слова помещается левее по картинке, в ячейке с меньшим адресом. То есть читать 4-хбайтовой слово надо побайтно-зеркально. На скрине показал наглядно.
Миниатюры:
Нажмите на изображение для увеличения
Название: Без-имени-1 (2).jpg
Просмотров: 0
Размер:	189.8 Кб
ID:	122958  
Реклама:
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 22.12.2017, 05:55  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

С FreeRTOS+Trace кто нибудь пробовал пользоваться? Смотрю там напрямую с j-link можно работать, правда три версии там есть. Цены не смотрел, но есть бесплатная версия анализатора.
https://freertos.org/FreeRTOS-Plus/F...us_Trace.shtml
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 24.12.2017, 10:57  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию 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 );
} 
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 24.12.2017, 15:02  
-Alan-
Прописка
 
Аватар для -Alan-
 
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
-Alan- на пути к лучшему
По умолчанию 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. Причина: Потерял скобку цикла
-Alan- вне форума  
Непрочитано 25.12.2017, 06:30  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

Сообщение от -Alan- Посмотреть сообщение
Попробуйте заменить
Код:
    //Queue
    xQueue = xQueueCreate(5, sizeof( struct xQueue_s * ));
На
Код:
    //Queue
    xQueue = xQueueCreate(5, sizeof( struct xQueue_s));
Обижается,пишет что не может sizeof узнать размер структуры.
Миниатюры:
Нажмите на изображение для увеличения
Название: 2017-12-25_10-28-13.png
Просмотров: 0
Размер:	38.8 Кб
ID:	123146  
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 25.12.2017, 06:34  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию 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 ?

Геморройно вручную выделять нужный размер памяти под структуру конечно,мне так кажется.
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 26.12.2017, 12:59  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

FreeRtos тож не панацея,особенно при применении мьютексов и инверсии приоритетов.
__________________
Глаза боятся,а руки делают.
CERGEI1982 вне форума  
Непрочитано 26.12.2017, 15:40  
-Alan-
Прописка
 
Аватар для -Alan-
 
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
-Alan- на пути к лучшему
По умолчанию 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. Причина: Форматирование
-Alan- вне форума  
Непрочитано 26.12.2017, 16:28  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

Все очень просто - каждый элемент очереди - размером всего в 4 байта, а элементов - 5. За один раз (за одну посылку) в очередь отправляется только один элемент, размером в 4 байта.
Это я относительно первого варианта кода
NewWriter вне форума  
Непрочитано 27.12.2017, 03:53  
CERGEI1982
Почётный гражданин KAZUS.RUN
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,578
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
CERGEI1982 на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

Сообщение от -Alan- Посмотреть сообщение
И, да, забыл убрать слово "struct". Должно сработать так:
xQueue = xQueueCreate(5, sizeof(xQueue_s));
Спасибо,сработало так.
Конечно хотелось бы передавать указателем,а не копировать все данные в очередь и обратно.
Но пока изучаю основы,в процессе применения бум экспериментировать.

Смотрю и в кубе есть freertos, с графической настройкой параметров.
Для чего это все,хал и куб с freertos,когда и так все понятно.Может хотели аналог ардуины,без знания регистров.
Миниатюры:
Нажмите на изображение для увеличения
Название: 2017-12-27_07-50-50.png
Просмотров: 0
Размер:	46.8 Кб
ID:	123244   Нажмите на изображение для увеличения
Название: 2017-12-27_08-32-31.png
Просмотров: 0
Размер:	78.1 Кб
ID:	123245  
__________________
Глаза боятся,а руки делают.

Последний раз редактировалось CERGEI1982; 27.12.2017 в 04:35.
CERGEI1982 вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с ОУ (приведение к "земле" напряжения со смещением) pittyalex Электроника - это просто 165 08.04.2015 00:55
Помогите разобраться с Контроллер Beckhoff CX1010-0021 wwwwwwww8 Микроконтроллеры, АЦП, память и т.д 9 20.05.2014 16:15
помогите разобраться в кварцах kobraxxx Информация по радиокомпонентам 9 05.01.2012 17:38
Помогите разобраться с PIC18F4550 и USB john2103 Микроконтроллеры, АЦП, память и т.д 26 02.08.2011 11:52
Как совместить Microblaze.bit с общим проектом ISE.bit? tixonia Цифровые сигнальные процессоры 1 28.12.2007 10:08


Часовой пояс GMT +4, время: 00:49.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.