Перейти к содержанию
    

Здравствуйте!

Есть порт для MIPS64, который работает, однако проверка была только на примере блинка от PIC32MZ

Далее решил попробовать взять более общий пример

https://github.com/blalor/FreeRTOS/blob/master/Demo/Common/Full/flash.c

И возникла проблема, - вместо запуска vLEDFlashTask ухожу в vApplicationMallocFailedHook() и там останавливаюсь.

Использую heap4 и следующие настройки:

#define configUSE_PREEMPTION                        1
#define configUSE_PORT_OPTIMISED_TASK_SELECTION     1
#define configCPU_CLOCK_HZ                          25000000
#define configTIMER_RATE_HZ                         ( ( TickType_t ) 10000000 )
#define configTICK_RATE_HZ                          1000
#define configUSE_16_BIT_TICKS                      0
#define configMAX_PRIORITIES                        5
//#define configMINIMAL_STACK_SIZE                   ( 2000 )
//#define configISR_STACK_SIZE                       ( 600 )

#define configMINIMAL_STACK_SIZE                    ( 1024 )
#define configISR_STACK_SIZE                        ( 2048 )
#define configTOTAL_HEAP_SIZE						( ( size_t ) (64*1024) )//( ( size_t )  

В распоряжении имеется только ОЗУ 256 КБ

В связи с этим есть подозрения на выделение heap секции в линкер-скрипте:

 ENTRY(_startup)

OUTPUT_FORMAT("elf64-tradlittlemips")
SEARCH_DIR(objs)
__DYNAMIC  =  0;
GROUP(-lc -lgcc)
STARTUP(crt.o)


PROVIDE(	 _stack			= (0xFFFFFFFFB503FFFF  +1)	);
PROVIDE(	_comm_start		= 0xFFFFFFFFB5000020	);
PROVIDE(	 text_start		= 0xFFFFFFFFB5000FA0 	);
PROVIDE(	 isr_start		= 0xFFFFFFFFB500E000 	); /*= 0xFFFFFFFFB500EA60 	); */
PROVIDE(	 _data_start	= 0xFFFFFFFFB500FA00 	);
PROVIDE(	 bss_start		= 0xFFFFFFFFB502EE00	);
PROVIDE(	 heap_start		= 0xFFFFFFFFB5032C80	);
PROVIDE(	_SRAM_ADDR_2_EX	= 0xFFFFFFFFB5000020	);				
PROVIDE(_min_stack_size = 0x400 );



_CACHE_ERR_EXCPT_ADDR          =  0x100 ;
_GEN_EXCPT_ADDR                =  0x200 ;

SECTIONS
{

	_text_start = .;
	. = _comm_start;
	
	.text.init1 :
	{
		_init1_start = ALIGN(8);	
		*(.text.init1)
		*(.text.init1.*)
		_init1_end = ALIGN(8);	
	} 
	. = _SRAM_ADDR_2_EX + SIZEOF(.text.init1);
	.text.me :
	{
		_me_start = ALIGN(8);	
	
		*(.text.me)
		*(.text.me.*)
	
		_me_end = ALIGN(8);
	}	
   
   . = isr_start;
   .text.simple_tlb_refill_vector :
	{
		_simple_tlb_refill_start = ALIGN(8);	
		*(.text.simple_tlb_refill_vector)
		*(.text.simple_tlb_refill_vector.*)
		_simple_tlb_refill_end = ALIGN(8);
	} 
	. =  isr_start + _CACHE_ERR_EXCPT_ADDR;
	.text.cache_err_vector :
	{	
		_cache_err_vector_start = ALIGN(8);
		*(.text.cache_err_vector)
		*(.text.cache_err_vector.*)
		_cache_err_vector_end = ALIGN(8);
	} 
	. = isr_start + _GEN_EXCPT_ADDR; 
	.text.gen_handler :
	{
		_gen_handler_start = ALIGN(8);
		*(.text.gen_handler)
		*(.text.gen_handler.*)
		KEEP(*(.SW_VEC1_Vector))
		KEEP(*(.CP0_TIM_VEC4_Handler))
		_gen_handler_end = ALIGN(8);
	} 
	
	.text.SW_VEC1_Vector :
	{
		_SW_VEC1_Vector_start = ALIGN(8);
		*(.text.SW_VEC1_Vector)
		*(.text.SW_VEC1_Vector.*)
		_SW_VEC1_Vector_end = ALIGN(8);
	} 
   	
   .text.CP0_TIM_VEC4_Vector :
	{
		_CP0_TIM_VEC4_Vector_start = ALIGN(8);
		*(.text.CP0_TIM_VEC4_Vector)
		*(.text.CP0_TIM_VEC4_Vector.*)
		_CP0_TIM_VEC4_Vector_end = ALIGN(8);
	} 
   
	.text : 
  	{	
		*(.text.init1) *(.text .text.*)
		KEEP(*(.init1))
		*(.text.me ) *(.text .text.*)
		KEEP(*(.me))

		*(.text.simple_tlb_refill_vector) *(.text .text.*)
		KEEP(*(.simple_tlb_refill_vector))

		*(.text.cache_err_vector) *(.text .text.*)
		KEEP(*(.cache_err_vector))
		
		*(.text.gen_handler) *(.text .text.*)
		KEEP(*(.gen_handler))
		
		*(.text.me) *(.text .text.*)
		KEEP(*(.me))
		
		*(.text)
   		*(.text.*)
			
		*(.gnu.linkonce.t.*)
		*(.mips16.fn.*)
		*(.mips16.call.*)
    	
  	}

	_etext = .;
	_text_end = ALIGN(8);
	
   	.data :
  	{
		_data_start = ALIGN(8);	
    	*(.data)
    	*(.data.*)
		_data_end = ALIGN(8);	
  	} 
  	. = .;
 	 _gp = ALIGN(8) + 0x7ff0;
	.sdata ALIGN(8) :
  	{
    	_sdata_begin = . ;
    	. = ALIGN(8) ;
		*(.sdata)
    	*(.sdata.*)
    	_sdata_end = . ;
  	} 


	. = ALIGN(8);
  	PROVIDE (edata  =  .);
  		_edata  =  .;
  		_fbss = .;
   		_bss_begin = . ;
  	.sbss ALIGN(8) :
 	{
    	_sbss_begin = . ;
    	*(.dynsbss)
    	*(.sbss .sbss.* .gnu.linkonce.sb.*)
    	*(.scommon)
    	_sbss_end = . ;
    	. = ALIGN(8) ;
  	} 
	.bss : 
	{
		_bss_start = ALIGN(8);
		*(.bss)	
		*(.bss.*)
		_bss_end = ALIGN(8) ;
	} 
	.heap :
  	{

		_heap_start = ALIGN(8);
   		*(.heap)
   		*(.heap.*)
		_heap_end = ALIGN(8);
  	} 

 	_stack_bottom = .;
	 . += _min_stack_size;
	 _stack_top = .;
	PROVIDE( __stack = _stack);
	
  	



 
  .gcc_compiled_long32     0 : { KEEP(*(.gcc_compiled_long32)) }
  .gcc_compiled_long64     0 : { KEEP(*(.gcc_compiled_long64)) }
  

} 

Прошу помочь разобраться, спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не совсем понял вопрос, в моем понимании есть два хипа, один для кода приложения, который располгается в heap секции линкера, другой для FreeRTOS, который располагается в bss секции

И настройки хипа в FreeRTOSconfig.h, как я понимаю, относятся к секции bss

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

42 minutes ago, addi II said:

один для кода приложения,

А приложение ведь работает под ОС. Зачем разносить память на две кучи? Я у себя в прогах переназначаю библиотечный распределитель памяти на распределитель FreeRTOS. Тут всё зависит от специфики программы, поэтому каждый решает, что ему больше подходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

логично, а как вы делаете распределение, просто меняете maaloc на pvmaaloc?

Все таки в чем может быть моя текущая ошибка....

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрим в heap_4.c:

#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )

/* The application writer has already defined the array used for the RTOS
* heap - probably so it can be placed in a special segment or address. */
    extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#else
    PRIVILEGED_DATA static uint8_t __attribute__ ((section (".hbss"))) ucHeap[ configTOTAL_HEAP_SIZE ];
#endif /* configAPPLICATION_ALLOCATED_HEAP */

configAPPLICATION_ALLOCATED_HEAP у вас не определён, так что heap будет распоглагаться в сегменте .hbss, который у вас в линкерном скрипте не описан. Куда попал в результате heap одному Богу известно 😞

2 hours ago, addi II said:

не совсем понял вопрос, в моем понимании есть два хипа, один для кода приложения, который располгается в heap секции линкера, другой для FreeRTOS, который располагается в bss секции

Вы уверены, что у вас 2 кучи? heap_4.c делает только одну. У вас ещё один алокатор где то есть?

12 hours ago, addi II said:

вместо запуска vLEDFlashTask ухожу в vApplicationMallocFailedHook() и там останавливаюсь.

Quote

 

vApplicationMallocFailedHook() is called if pvPortMalloc() returns NULL.

 

С кучей проблемы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в случае heap4, получается если я не использую configAPPLICATION_ALLOCATED_HEAP, то я должен выделить в линкере секцию .hbss, и наоборот должен создать массив ucHeap и тогда ртос сама распределит хип в bss??

в случае heap2, я могу не использовать configAPPLICATION_ALLOCATED_HEAP, и не создавать массив ucHeap

Если так, то в моем случае, когда присутствует свой линкер(в таком виде в котором он есть выше) то лучше перейти на heap2, если я правильно понял

Изменено пользователем addi II

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

перешел на heap2, - ничего не поменялось

И мэп файл почему-то не показывает heap секцию:

Sections:
Idx Name                           Size      VMA               LMA               File off  Algn  Flags
  0 .text.init1                    000001b8  ffffffffb5000020  ffffffffb5000020  00010020  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .text.me                       0000000c  ffffffffb50001d8  ffffffffb50001d8  000101d8  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .text.simple_tlb_refill_vector 00000008  ffffffffb500e000  ffffffffb500e000  0001e000  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  3 .text.cache_err_vector         00000008  ffffffffb500e100  ffffffffb500e100  0001e100  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  4 .text.gen_handler              000000b0  ffffffffb500e200  ffffffffb500e200  0001e200  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  5 .text                          0000df28  ffffffffb500e2b0  ffffffffb500e2b0  0001e2b0  2**2  CONTENTS, ALLOC, LOAD, READONLY, CODE
  6 .init                          00000024  ffffffffb501c1d8  ffffffffb501c1d8  0002c1d8  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  7 .fini                          0000001c  ffffffffb501c1fc  ffffffffb501c1fc  0002c1fc  2**0  CONTENTS, ALLOC, LOAD, READONLY, CODE
  8 .MIPS.abiflags                 00000018  ffffffffb501c218  ffffffffb501c218  0002c218  2**3  CONTENTS, ALLOC, LOAD, READONLY, DATA, LINK_ONCE_SAME_SIZE
  9 .eh_frame                      00000004  ffffffffb501c230  ffffffffb501c230  0002c230  2**2  CONTENTS, ALLOC, LOAD, READONLY, DATA
 10 .rodata                        0000017d  ffffffffb501c238  ffffffffb501c238  0002c238  2**3  CONTENTS, ALLOC, LOAD, READONLY, DATA
 11 .ctors                         00000010  ffffffffb501c3b8  ffffffffb501c3b8  0002c3b8  2**3  CONTENTS, ALLOC, LOAD, DATA
 12 .dtors                         00000010  ffffffffb501c3c8  ffffffffb501c3c8  0002c3c8  2**3  CONTENTS, ALLOC, LOAD, DATA
 13 .jcr                           00000008  ffffffffb501c3d8  ffffffffb501c3d8  0002c3d8  2**3  CONTENTS, ALLOC, LOAD, DATA
 14 .sdata                         00000030  ffffffffb501c3e0  ffffffffb501c3e0  0002c3e0  2**3  CONTENTS, ALLOC, LOAD, DATA
 15 .sbss                          000000c0  ffffffffb501c410  ffffffffb501c410  0002c410  2**3  ALLOC
 16 .bss                           00010240  ffffffffb501c4d0  ffffffffb501c4d0  0002c410  2**3  ALLOC
 17 .MIPS.options                  00000398  0000000000000000  0000000000000000  0002c410  2**3  CONTENTS, READONLY
 18 .pdr                           000016a0  0000000000000000  0000000000000000  0002c7a8  2**2  CONTENTS, READONLY
 19 .gnu.attributes                00000010  0000000000000000  0000000000000000  0002de48  2**0  CONTENTS, READONLY
 20 .comment                       00000044  0000000000000000  0000000000000000  0002de58  2**0  CONTENTS, READONLY
 21 .debug_line                    00003892  0000000000000000  0000000000000000  0002de9c  2**0  CONTENTS, READONLY, DEBUGGING
 22 .debug_info                    0000b30f  0000000000000000  0000000000000000  0003172e  2**0  CONTENTS, READONLY, DEBUGGING
 23 .debug_abbrev                  00001beb  0000000000000000  0000000000000000  0003ca3d  2**0  CONTENTS, READONLY, DEBUGGING
 24 .debug_aranges                 00000390  0000000000000000  0000000000000000  0003e630  2**4  CONTENTS, READONLY, DEBUGGING
 25 .debug_str                     000027ab  0000000000000000  0000000000000000  0003e9c0  2**0  CONTENTS, READONLY, DEBUGGING
 26 .debug_ranges                  00000070  0000000000000000  0000000000000000  00041170  2**4  CONTENTS, READONLY, DEBUGGING
 27 .debug_frame                   00001ff0  0000000000000000  0000000000000000  000411e0  2**3  CONTENTS, READONLY, DEBUGGING

 

Изменено пользователем addi II

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, addi II said:

в случае heap2, я могу не использовать configAPPLICATION_ALLOCATED_HEAP, и не создавать массив ucHeap

 

Он вам создаст кучу в bss секции. В остальном разницы с heap_4 нет.

4 hours ago, addi II said:

И мэп файл почему-то не показывает heap секцию:

Вы ничего туда не положили, так что линкер её выкинул (она пустая)

Может у вас программа успела наалоцировать что то из кучи, и она банально закончилась?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, xvr said:

Вы ничего туда не положили, так что линкер её выкинул (она пустая)

Дело в том что я кладу, в одном из тасков maaloc:

* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/* Standard includes. */
#include <stdio.h>

/* Kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"

/* Standard demo includes. */
#include "partest.h"
#include "semphr.h"
#include "flash.h"
////
#include "iolib.h"
#include "partest.h"
//#include "uart.h"

#define IOP1_BASE			0xffffffffB610FF50
#define IOP2_BASE			0xffffffffB610FF58 // DIR
#define ledSTACK_SIZE    configMINIMAL_STACK_SIZE

/* Priority definitions for all the tasks in the demo application. */
#define mainLED_TASK_PRIORITY			( tskIDLE_PRIORITY + 1 )
#define mainCREATOR_TASK_PRIORITY		( tskIDLE_PRIORITY + 3 )
#define mainPRINT_TASK_PRIORITY			( tskIDLE_PRIORITY + 5 )
#define mainQUEUE_POLL_PRIORITY			( tskIDLE_PRIORITY + 2 )
#define mainQUEUE_BLOCK_PRIORITY		( tskIDLE_PRIORITY + 3 )
#define mainCOM_TEST_PRIORITY			( tskIDLE_PRIORITY + 3 )
#define mainSEMAPHORE_TASK_PRIORITY		( tskIDLE_PRIORITY + 1 )

/*-----------------------------------------------------------*/
/* Structure used to pass parameters to the LED tasks. */
typedef struct LED_PARAMETERS
{
    unsigned portBASE_TYPE uxLED; /*< The output the task should use. */
    TickType_t xFlashRate;        /*< The rate at which the LED should flash. */
} xLEDParameters;

/* The task that is created eight times - each time with a different xLEDParaemtes
 * structure passed in as the parameter. */
static void vLEDFlashTask( void * pvParameters );


/*-----------------------------------------------------------*/

void vStartLEDFlashTasks( unsigned portBASE_TYPE uxPriority )
{
    unsigned portBASE_TYPE uxLEDTask;
    xLEDParameters * pxLEDParameters;
    const unsigned portBASE_TYPE uxNumOfLEDs = 8;
    const TickType_t xFlashRate = 125;

    /* Create the eight tasks. */
    for( uxLEDTask = 0; uxLEDTask < uxNumOfLEDs; ++uxLEDTask )
    {
        /* Create and complete the structure used to pass parameters to the next
         * created task. */
        pxLEDParameters = ( xLEDParameters * ) pvPortMalloc( sizeof( xLEDParameters ) );
        pxLEDParameters->uxLED = uxLEDTask;
        pxLEDParameters->xFlashRate = ( xFlashRate + ( xFlashRate * ( TickType_t ) uxLEDTask ) );
        pxLEDParameters->xFlashRate /= portTICK_PERIOD_MS;

        /* Spawn the task. */
        xTaskCreate( vLEDFlashTask, "LEDx", ledSTACK_SIZE, ( void * ) pxLEDParameters, uxPriority, ( TaskHandle_t * ) NULL );
		*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA51;
    }
}
/*-----------------------------------------------------------*/

static void vLEDFlashTask( void * pvParameters )
{
    xLEDParameters * pxParameters;

    /* Queue a message for printing to say the task has started. */
    ///vPrintDisplayMessage( &pcTaskStartMsg );

    pxParameters = ( xLEDParameters * ) pvParameters;

    for( ; ; )
    {
        /* Delay for half the flash period then turn the LED on. */
        vTaskDelay( pxParameters->xFlashRate / ( TickType_t ) 2 );
        vParTestToggleLED( pxParameters->uxLED );
		*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA52;

        /* Delay for half the flash period then turn the LED off. */
        vTaskDelay( pxParameters->xFlashRate / ( TickType_t ) 2 );
        vParTestToggleLED( pxParameters->uxLED );
		*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA53;
    }
}

void main( void )
{

/* Initialise hardware and utilities. */
	vParTestInitialise();
	vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
	calls vTaskEndScheduler(). */
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA50;
	vTaskStartScheduler();
	for( ;; );
}
/*-----------------------------------------------------------*/

/////////////////////////////////////////////////////////////////


void vApplicationTickHook( void )
{

	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA87;
	asm("nop");

}

void vApplicationIdleHook( void )
{
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA88;
}

void vApplicationMallocFailedHook( void )
{
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA89;
	taskDISABLE_INTERRUPTS();
	for( ;; );
}

void vAssertCalled( const char *pcFileName, unsigned long ulLine )
{
    asm("di");
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA86;
	for (;;);
}
///

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 3/30/2023 at 9:48 AM, addi II said:

Дело в том что я кладу, в одном из тасков maaloc:

 

Кто такой maaloc? Это pvPortMalloc?

Посчитайте, сколько памяти вы заказываете. Это ваша структура xLEDParameters + стек на таску + сама таска внутри FreeRTOS. Это всё помножить на uxNumOfLEDs. Кучв не переполнилась?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, xvr said:

Кто такой maaloc? Это pvPortMalloc?

Да, дело в том что я взял готовый пример, предполагая что он априори рабочий

 * FreeRTOS V202112.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 * 1 tab == 4 spaces!
 */


/**
 * Creates eight tasks, each of which flash an LED at a different rate.  The first
 * LED flashes every 125ms, the second every 250ms, the third every 375ms, etc.
 *
 * The LED flash tasks provide instant visual feedback.  They show that the scheduler
 * is still operational.
 *
 * The PC port uses the standard parallel port for outputs, the Flashlite 186 port
 * uses IO port F.
 *
 * \page flashC flash.c
 * \ingroup DemoFiles
 * <HR>
 */

/*
 * Changes from V2.0.0
 *
 + Delay periods are now specified using variables and constants of
 +    TickType_t rather than unsigned long.
 +
 + Changes from V2.1.1
 +
 + The stack size now uses configMINIMAL_STACK_SIZE.
 + String constants made file scope to decrease stack depth on 8051 port.
 */

#include <stdlib.h>

/* Scheduler include files. */
#include "FreeRTOS.h"
#include "task.h"

/* Demo program include files. */
#include "partest.h"
#include "flash.h"
#include "print.h"

#define ledSTACK_SIZE    configMINIMAL_STACK_SIZE

/* Structure used to pass parameters to the LED tasks. */
typedef struct LED_PARAMETERS
{
    unsigned portBASE_TYPE uxLED; /*< The output the task should use. */
    TickType_t xFlashRate;        /*< The rate at which the LED should flash. */
} xLEDParameters;

/* The task that is created eight times - each time with a different xLEDParaemtes
 * structure passed in as the parameter. */
static void vLEDFlashTask( void * pvParameters );

/* String to print if USE_STDIO is defined. */
const char * const pcTaskStartMsg = "LED flash task started.\r\n";

/*-----------------------------------------------------------*/

void vStartLEDFlashTasks( unsigned portBASE_TYPE uxPriority )
{
    unsigned portBASE_TYPE uxLEDTask;
    xLEDParameters * pxLEDParameters;
    const unsigned portBASE_TYPE uxNumOfLEDs = 8;
    const TickType_t xFlashRate = 125;

    /* Create the eight tasks. */
    for( uxLEDTask = 0; uxLEDTask < uxNumOfLEDs; ++uxLEDTask )
    {
        /* Create and complete the structure used to pass parameters to the next
         * created task. */
        pxLEDParameters = ( xLEDParameters * ) pvPortMalloc( sizeof( xLEDParameters ) );
        pxLEDParameters->uxLED = uxLEDTask;
        pxLEDParameters->xFlashRate = ( xFlashRate + ( xFlashRate * ( TickType_t ) uxLEDTask ) );
        pxLEDParameters->xFlashRate /= portTICK_PERIOD_MS;

        /* Spawn the task. */
        xTaskCreate( vLEDFlashTask, "LEDx", ledSTACK_SIZE, ( void * ) pxLEDParameters, uxPriority, ( TaskHandle_t * ) NULL );
    }
}
/*-----------------------------------------------------------*/

static void vLEDFlashTask( void * pvParameters )
{
    xLEDParameters * pxParameters;

    /* Queue a message for printing to say the task has started. */
    vPrintDisplayMessage( &pcTaskStartMsg );

    pxParameters = ( xLEDParameters * ) pvParameters;

    for( ; ; )
    {
        /* Delay for half the flash period then turn the LED on. */
        vTaskDelay( pxParameters->xFlashRate / ( TickType_t ) 2 );
        vParTestToggleLED( pxParameters->uxLED );

        /* Delay for half the flash period then turn the LED off. */
        vTaskDelay( pxParameters->xFlashRate / ( TickType_t ) 2 );
        vParTestToggleLED( pxParameters->uxLED );
    }
}

И попробовал увеличить стек до 96, заработало(пошло далее исполнение, правда не проверял во времени), но такого жорства не должно быть, и я не вижу в этом примере где происходить освобождение памяти, получается она бесконечно выделяется

Или я не прав?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 minutes ago, addi II said:

и я не вижу в этом примере где происходить освобождение памяти, получается она бесконечно выделяется

Оно выделяется один раз при старте, и не освобождается. А по поводу прожоливости - посчитайте размер на один LED (я всм писал уже, что туда входит). И помножте на количесвто LED'ов

4 minutes ago, addi II said:

Да, дело в том что я взял готовый пример, предполагая что он априори рабочий

 

В готовом примере нет функции maaloc, которую вы упоминаете (равно как и в вашеи предыдущем примере её нет)

Ну и то, что пример готовый и работоспособный, совсем не значит что он у вас заработает - окружение разное (размер кучи например)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

никак не могу понять почему ухожу в хип, ведь выделяется немного памяти у меня всего 4 диода....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...