Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 19.12.2017, 17:52  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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 xTP1xTP2;

/*-----------------------------------------------------------*/
void vTaskReseptvoid *pvParametrs);
void vTaskSendvoid *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(
xQueueSendToBackFromISRxQueue,&xInt,&xHigherPriorityTaskWoken ) != pdPASS)
        { 
err=1;}
        
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
    }
    
}

//////////////////////////////////////////////////////////
// MAIN
int mainvoid )
{
    
    
char error_queue,error_semafor;
    
    
// init_hard
    
init_();
    
    
    
//Queue
    
xQueue xQueueCreate(5sizeofstruct xQueue_s * ));
    
    
    
// error queue
     
if( xQueue == )
    {
        while(
1error_queue=1;
    }
    
        
        
// Task
    
xTaskCreatevTaskResept
        ( const 
char * ) "TaskResept",
        
configMINIMAL_STACK_SIZE,
        (
void*)2
        
3,
        &
xTask1_Handle );
        
    
xTaskCreatevTaskSend
                            ( const 
char * ) "TaskSend"
                   
configMINIMAL_STACK_SIZE
                                
NULL
                                
2
                                &
xTask2_Handle );

    
//xTP1.period=sizeof(tskTCB);
    
vTaskStartScheduler();
    
    
// error
    
while (1) {  }
}

////////////////////////////////////////////////////////////////////
// TASK
void vTaskReseptvoid *pvParameters )
{
    
    
//-----------------------------------------------------------
  
xQueue_s xRxedMessage;
    
portBASE_TYPE xStatus;
    
//xRxedMessage.lText=(long) pvParameters;
    //-------------------------------------------------------
    
    
for( ;; )
    {
        
xStatus xQueueReceive(xQueue, &xRxedMessageportMAX_DELAY);
            
GPIOC-›ODR ^= GPIO_ODR_ODR13;
            
vTaskDelay(xRxedMessage.lText/portTICK_PERIOD_MS);
    }
    
//vTaskDelete( NULL );
}

//////////////////////////////////////////////////////////////////////
// TASK
void vTaskSendvoid *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.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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
Заблокирован
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,220 раз(а) в 1,319 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: FreeRTOS?? Разобраться с демо проектом??

Все очень просто - каждый элемент очереди - размером всего в 4 байта, а элементов - 5. За один раз (за одну посылку) в очередь отправляется только один элемент, размером в 4 байта.
Это я относительно первого варианта кода
NewWriter вне форума  
Непрочитано 27.12.2017, 03:53  
CERGEI1982
Почётный гражданин KAZUS.RU
 
Аватар для CERGEI1982
 
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 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, время: 23:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot