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

вложенные прерывания - архитектура

Спасибо за поддержку!

Получается Task Frame создает vPortStartFirstTask или pxPortInitialiseStack?

По поводу инициализации с тартапе, я так и делаю:

        ##################################################################

        # Initialize Stack Pointer

        #   _stack is initialized by the linker script to point to the

        #    starting location of the stack in RAM

        ##################################################################

       dla      sp,__stack

       

 

        ##################################################################

        # Initialize Global Pointer

        #   _gp is initialized by the linker script to point to "middle"

        #   of the small variables region

        ##################################################################

        dla      gp,_gp


и весь код мой, кроме FreeRTOS

14 hours ago, xvr said:

Загружать явно в нужное значение (и не забыть его созранить и восстеновить в контексте)

не совсем понял, читать из тени??

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

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


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

6 hours ago, addi II said:

не совсем понял, читать из тени??

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

6 hours ago, addi II said:

Получается Task Frame создает vPortStartFirstTask или pxPortInitialiseStack?

pxPortInitialiseStack создаёт, а vPortStartFirstTask его запускает (первый запуск слегка отличается от классического переключения тасков - там нет входа в прерывание, а сама vPortStartFirstTask по сути эмулирует выход из прерывания)

6 hours ago, addi II said:

По поводу инициализации с тартапе, я так и делаю:

Ok

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


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

спасибо, а нужно ли инициализировать нулями какую либо секцию линкера?(bss, stack, heap)?

Чтобы в рамках FreeRTOS выделение памяти происходило без последствий

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


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

1 hour ago, addi II said:

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

Эти нет (точнее bss в стартапе нужно нулями прописать. В линкере их инициализирвоанть не надо)

1 hour ago, addi II said:

Чтобы в рамках FreeRTOS выделение памяти происходило без последствий

bss должен затереть нулями стартап (вы на С пишете, так что неинициализированные глобальнае переменные должны быть нулями при старте - стандарт С никто не отменял).

Динамическая память выделется из heap (или откуда вы сами менеджер памяти настроите), в любом случае он (менеджер) к начальному содержимому heap нечуствителен

 

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


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

Спасибо, я занулил и sbss, ничего страшного?

        ##################################################################
        # Clear uninitialized data sections
        ##################################################################
        dla      t0,_bss_begin
        dla      t1,_bss_end
        b       _bss_check
        nop

_bss_init:
        sw      zero,0x0(t0)
        sw      zero,0x4(t0)
        sw      zero,0x8(t0)
        sw      zero,0xc(t0)
        addu    t0,16
_bss_check:
        bltu    t0,t1,_bss_init
        nop



  ##################################################################
        # Clear uninitialized data sections
        ##################################################################
        dla      t0,_sbss_begin
        dla      t1,_sbss_end
        b       _sbss_check
        nop

_sbss_init:
        sw      zero,0x0(t0)
        sw      zero,0x4(t0)
        sw      zero,0x8(t0)
        sw      zero,0xc(t0)
        addu    t0,16
_sbss_check:
        bltu    t0,t1,_sbss_init
        nop

 

 

я почему спрашиваю, потому что пока что все изменения к лучшему не приводят, к нормальной работе планировщика(сейчас вообще таск не запускает, ни один)

и похоже это какая то системная ошибка, поэтому я вернулся к линкеру

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

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


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

3 hours ago, addi II said:

Спасибо, я занулил и sbss, ничего страшного?

 

Нормально

3 hours ago, addi II said:

сейчас вообще таск не запускает, ни один

vTaskStartScheduler(); позвали?

 

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


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

1 hour ago, xvr said:

Нормально

vTaskStartScheduler(); позвали?

 

угу, в этой части я ничего не трогал, переписываю сейчас (пытаюсь сделать одинаковое смещение всего сохраняемого контекста) только vPortStartFirstTask, pxPortInitialiseStack, portSAVE_CONTEXT, portYIELD_SAVE, portRESTORE_CONTEXT, portYIELD_RESTORE

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


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

Что-то никак), прошу снова помощи!

Вроде все сделал по замечаниям, но в итоге застрял на функции vPortStartFirstTask

Вот мой main

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

#include "iolib.h"

#define IOP1_BASE			0xffffffffB610FF50
 
 
static void CheckTask( void *pvParameters );
static void FillTask( void *pvParameters );
int16_t temp=1000;
//-----------------------------------------------------------
void main(void)
{

BaseType_t xReturned;
BaseType_t xReturned2;
*((volatile uint16_t* const)(IOP1_BASE  )) = 0x0000;
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA55;

		 xReturned = xTaskCreate( CheckTask, ( signed char * ) "CheckTask",	configMINIMAL_STACK_SIZE, NULL,  ( tskIDLE_PRIORITY + 1 ), NULL ); // tskIDLE_PRIORITY + 2 , NULL );
		if( xReturned == pdPASS )
		 xReturned2 = xTaskCreate( FillTask, ( signed char * ) "FillTask", configMINIMAL_STACK_SIZE, NULL,  ( tskIDLE_PRIORITY + 1 ), NULL ); //tskIDLE_PRIORITY + 1 , NULL );
		if( xReturned2 == pdPASS )
		vTaskStartScheduler();
	for( ;; );
}

for( ;;)
{
	
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0xAA54;
	temp ++ ;
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = temp;///0xAA00;

}
	
}
/*-----------------------------------------------------------*/

static void CheckTask( void *pvParameters )
{
    for(;;){
		
		*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0x55AA;
		if(temp)
		temp--;
*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = temp;
		  
    }
}

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

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

Вот планировщик:

BaseType_t xPortStartScheduler( void )
{
extern void vPortStartFirstTask( void );
extern void *pxCurrentTCB;
#if ( configCHECK_FOR_STACK_OVERFLOW > 2 )
{
	/* Fill the ISR stack to make it easy to asses how much is being used. */
	memset( ( void * ) xISRStack, portISR_STACK_FILL_BYTE, sizeof( xISRStack ) );
}
#endif /* configCHECK_FOR_STACK_OVERFLOW > 2 */

	/* Kick off the highest priority task that has been created so far.
	Its stack location is loaded into uxSavedTaskStackPointer. */
	uxSavedTaskStackPointer = *( UBaseType_t * ) pxCurrentTCB;

	mips_eic0_setmask(9);
    mips32_bissr (SR_IE);
    mips_setcount(0);
    mips_setcompare(0x3000);

    /* Start Counting */
	mips_biscr(CR_DC);

	vPortStartFirstTask();
	asm("nop");

	/* Should never get here as the tasks will now be executing!  Call the task
	exit error function to prevent compiler warnings about a static function
	not being called in the case that the application writer overrides this
	functionality by defining configTASK_RETURN_ADDRESS. */
	prvTaskExitError();

	return pdFALSE;
}

Вот вектор yield:

_SW_VEC1_handler:
		di
		ehb
		rdpgpr  k1, $29
		REG_S   k1, (sp)
		rdpgpr  k1, $28
		REG_S   k1, (gp)
		portYIELD_SAVE
		jal		vTaskSwitchContext
		nop
		nop
		portYIELD_RESTORE
		ei
		ehb
		eret
		.end _SW_VEC1_handler

Вот вектор increment ticktimer

_CP0_TIM_VEC4_handler:
	
	mfc0    a0, C0_CAUSE
	li      a1, ~(1 << 27)
	and     a0, a0, a1
	mtc0    a0, C0_CAUSE
	ehb
	di
	ehb
	rdpgpr  k1, $29
	REG_S   k1, (sp)
	rdpgpr  k1, $28
	REG_S   k1, (gp)
	portSAVE_CONTEXT 
	jal		vPortIncrementTick
	nop
	nop
	portRESTORE_CONTEXT /*addition*/
	mtc0	zero, C0_COUNT
	ehb
	mfc0    a0, C0_CAUSE
	li      a1, (1 << 27)
	or      a0, a0, a1
	mtc0    a0, C0_CAUSE
	ehb
	ei
	ehb
	eret
	.end _CP0_TIM_VEC4_handler

Вот pxPortInitialiseStack

#define IOP1_BASE			0xffffffffB610FF50
#define			_cv0 48
#define			_cv1 56
#define			_ca0 64
#define			_ca1 72
#define			_ca2 80
#define			_ca3 88
#define			_ct0 96
#define			_ct1 104
#define			_ct2 112
#define			_ct3 120
#define			_ct4 128
#define			_ct5 136
#define			_ct6 144
#define			_ct7 152
#define			_ct8 160
#define			_ct9 168
#define			_cs0 176
#define			_cs1 184
#define			_cs2 192
#define			_cs3 200
#define			_cs4 208
#define			_cs5 216
#define			_cs6 224
#define			_cs7 232
#define			_ck0 240
#define			_ck1 248
#define			_cra 280
#define _cCAUSE	288
#define _cSTATUS	296
#define _cEPC	304		


#define portCONTEXT_SIZE                312
StackType_t *pxPortInitialiseStack( StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters )
{
*pxTopOfStack = (StackType_t) 0xEFACABCDDEADBEEF;
	pxTopOfStack--;

	*pxTopOfStack = (StackType_t) 0x1234567890876543;       /* Word to which the stack pointer will be left pointing after context restore. */
	pxTopOfStack--;

	/* create a space for a full context */
	pxTopOfStack -= portCONTEXT_SIZE;

	/* fill up some initial values for us to kick in */
	*( pxTopOfStack + _cCAUSE) = (StackType_t) mips_getcr();
	*( pxTopOfStack + _cSTATUS ) = (StackType_t) (mips32_get_c0(C0_STATUS) | portINITIAL_SR);
	*( pxTopOfStack + _cEPC ) = (StackType_t) pxCode;
	*( pxTopOfStack + _cra ) = (StackType_t) portTASK_RETURN_ADDRESS;
	*( pxTopOfStack + _ca0 ) = (StackType_t) pvParameters; /* Parameters to pass in. */

	/* Save GP register value in the context */
	asm volatile ("sd $gp, %0" : "=m" (*( pxTopOfStack + _cv0 )));

	return pxTopOfStack; 
}

Вот первый таск

LEAF(vPortStartFirstTask)
portRESTORE_CONTEXT
END(vPortStartFirstTask)

Вот сохранение контекста

.macro  portSAVE_CONTEXT
	mfc0		k0, C0_CAUSE
   	addiu       sp, sp, -portCONTEXT_SIZE
	mfc0		k1, C0_STATUS
	nop 
	nop 
	sw			s7, _cs7(sp)
	sw			s6, _cs6(sp)
	sw			s5, _cs5(sp)
	sw			k1, portSTATUS_STACK_LOCATION(sp)
	srl			k0, k0, 0xa
	ins 		k1, k0, 10, 7
	srl			k0, k0, 0x7
	ins 		k1, k0, 18, 1
	ins			k1, zero, 1, 4
	add		s5, zero, sp
	dla			k0, uxInterruptNesting
	lw			s6, (k0)
	bne			s6, zero, 1f
	nop
	dla			sp, xISRStackTop
	lw			sp, (sp)
	1:	addiu	s6, s6, 1
	sw			s6, 0(k0)
	mfc0 		s6, C0_EPC
	mtc0		k1, C0_STATUS
	sw			ra, _cra(s5)
	sw			t9, _ct9(s5)
	sw			t8, _ct8(s5)
	sw			$15, _ct7(s5)
	sw			$14, _ct6(s5)
	sw			$13, _ct5(s5)
	sw			$12, _ct4(s5)
	sw			t3, _ct3(s5)
	sw			t2, _ct2(s5)
	sw			t1, _ct1(s5)
	sw			t0, _ct0(s5)
	sw			a3, _ca3(s5)
	sw			a2, _ca2(s5)
	sw			a1, _ca1(s5)
	sw			a0, _ca0(s5)
	sw			v1, _cv1(s5)
	sw			v0, _cv0(s5)
	sw			s6, portEPC_STACK_LOCATION(s5)
	sw			$1, 16(s5)
	dla			s7, pxCurrentTCB
	REG_L		s7, (s7)
	REG_S		s5, (s7)
	dla			s6, uxInterruptNesting
	lw			s6, (s6)
	addiu		s6, s6, -1
	bne			s6, zero, 2f
	nop
	dla         s6, uxSavedTaskStackPointer
	REG_S       s5, (s6)
2:
.endm

Вот восстановление контекста

.macro  portRESTORE_CONTEXT
	dla			s6, uxInterruptNesting
	lw			s6, (s6)
	addiu		s6, s6, -1
	bne			s6, zero, 1f
	nop
	dla          s6, uxSavedTaskStackPointer
	lw			s5, (s6)
	dla			s0, pxCurrentTCB
	REG_L		s0, (s0)
	REG_L		s5, (s0)
1:
	
	lw			s7, _cs7(s5)
	lw			s6, _cs6(s5)
	lw			v0, _cv0(s5)
	lw			v1, _cv1(s5)
	lw			a0, _ca0(s5)
	lw			a1, _ca1(s5)
	lw			a2, _ca2(s5)
	lw			a3, _ca3(s5)
	lw			t0, _ct0(s5)
	lw			t1, _ct1(s5)
	lw			t2, _ct2(s5)
	lw			t3, _ct3(s5)
	lw			$12, _ct4(s5)
	lw			$13, _ct5(s5)
	lw			$14, _ct6(s5)
	lw			$15, _ct7(s5)
	lw			t9, _ct9(s5)
	lw			ra, _cra(s5)
	di
	ehb
	dla			k0, uxInterruptNesting
	lw			k1, (k0)
	addiu		k1, k1, -1
	sw			k1, 0(k0)
	lw			k0, portSTATUS_STACK_LOCATION(s5)
	lw			k1, portEPC_STACK_LOCATION(s5)
	add			sp, zero, s5
	lw			s5, _cs5(sp)
	addu        sp, sp, portCONTEXT_SIZE 
	mtc0		k0, C0_STATUS
	mtc0 		k1, C0_EPC
	ehb

.endm

Вот сохранение yield

.macro portYIELD_SAVE
	addiu      sp, sp, -portCONTEXT_SIZE 
	mfc0	k1, C0_STATUS
	sw		s6, _cs6(sp)
	sw		s5, _cs5(sp)
	sw		k1, portSTATUS_STACK_LOCATION(sp)
	ins 	k1, zero, 10, 7         /* Clear IPL bits 0:6. */
	ins 	k1, zero, 18, 1    
	ori		k1, k1, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 )
	ins		k1, zero, 1, 4          /* Clear EXL, ERL and UM. */
	add		s5, zero, sp
	dla		sp, xISRStackTop
	lw		sp, (sp)
	dla		k0, uxInterruptNesting
	addiu	s6, zero, 1
	sw		s6, 0(k0)
	mfc0 	s6, C0_EPC
	mtc0	k1, C0_STATUS
	sw		ra, _cra(s5)
	sw		t9, _ct9(s5)
	sw		t8, _ct8(s5)
	sw		$15, _ct7(s5)
	sw		$14, _ct6(s5)
	sw		$13, _ct5(s5)
	sw		$12, _ct4(s5)
	sw		t3, _ct3(s5)
	sw		t2, _ct2(s5)
	sw		t1, _ct1(s5)
	sw		t0, _ct0(s5)
	sw		a3, _ca3(s5)
	sw		a2, _ca2(s5)
	sw		a1, _ca1(s5)
	sw		a0, _ca0(s5)
	sw		v1, _cv1(s5)
	sw		v0, _cv0(s5)
	sw		s7, _cs7(s5)
	sw		s6, portEPC_STACK_LOCATION(s5)
	sw		s4, _cs7(s5)
	sw		s3, _cs3(s5)
	sw		s2, _cs2(s5)
	sw		s1, _cs1(s5)
	sw		s0, _cs0(s5)
	sw		$1, 16(s5)
	dla			s7, pxCurrentTCB
	REG_L		s7, (s7)
	REG_S		s5, (s7)
	di
	ehb
	mfc0	s7, C0_STATUS
	ins 	s7, zero, 10, 7
	ins 	s7, zero, 18, 1
	ori		s6, s7, ( configMAX_SYSCALL_INTERRUPT_PRIORITY << 10 ) | 1
	mtc0	s6, C0_STATUS
	ehb
	mfc0	s6, C0_CAUSE
	ins		s6, zero, 8, 1
	mtc0	s6, C0_CAUSE
	ehb
.endm

Вот восстановление yield

.macro portYIELD_RESTORE

	mtc0	s7, C0_STATUS
	ehb
	dla			s0, pxCurrentTCB
	REG_L		s0, (s0)
	REG_L		s5, (s0)
	lw		$1, 16(s5)
	lw		s0, _cs0(s5)
	lw		s1, _cs1(s5)
	lw		s2, _cs2(s5)
	lw		s3, _cs3(s5)
	lw		s4, _cs4(s5)
	lw		s6, _cs6(s5)
	lw		s7, _cs7(s5)
	lw		v0, _cv0(s5)
	lw		v1, _cv1(s5)
	lw		a0, _ca0(s5)
	lw		a1, _ca1(s5)
	lw		a2, _ca2(s5)
	lw		a3, _ca3(s5)
	lw		t0, _ct0(s5)
	lw		t1, _ct1(s5)
	lw		t2, _ct2(s5)
	lw		t3, _ct3(s5)
	lw		$12, _ct4(s5)
	lw		$13, _ct5(s5)
	lw		$14, _ct6(s5)
	lw		$15, _ct7(s5)
	lw		t8, _ct8(s5)
	lw		t9, _ct9(s5)
	lw		ra, _cra(s5)
	di
	ehb
	dla		k0, uxInterruptNesting
	sw		zero, 0(k0)
	add		sp, zero, s5
	lw		s5, _cs5(sp)
	lw		k1, portSTATUS_STACK_LOCATION(sp)
	lw		k0, portEPC_STACK_LOCATION(sp)
	addiu		sp, sp, portCONTEXT_SIZE 
	mtc0	k1, C0_STATUS
	mtc0 	k0, C0_EPC
	ehb
.endm

В итоге останавливаюсь в vPortStartFirstTask

на строчке

lw  $6,80($21)

далее ухожу в исключение

Настройки системы следующие


#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 configTOTAL_HEAP_SIZE						( ( size_t ) (16*4096) )//( ( size_t ) (64*4096) )
#define configMAX_TASK_NAME_LEN                     ( 16 )

#define configTASK_RETURN_ADDRESS					(0xffffffffbfc00000)
//extern void vDeleteCallingTask( void );
///#define configTASK_RETURN_ADDRESS NULL
///

#define configCHECK_FOR_STACK_OVERFLOW             3

/* Hook functions */
#define configUSE_IDLE_HOOK                         0
#define configUSE_TICK_HOOK                         0

/* Co routines */
#define configUSE_CO_ROUTINES                       0

/* The interrupt priority of the RTOS kernel */
#define configKERNEL_INTERRUPT_PRIORITY             0x01

/*-*/
/* The maximum interrupt priority from which FreeRTOS.org API functions can
be called.  Only API functions that end in ...FromISR() can be used within
interrupts. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY	0x03
/*-*/

/* The maximum priority from which API functions can be called */
#define configMAX_API_CALL_INTERRUPT_PRIORITY       0x03

/* Prevent assert code from being used in assembly files */
#ifndef __ASSEMBLER__
	void vAssertCalled( const char *pcFileName, unsigned long ulLine );
	#define configASSERT( x )						\
		do {										\
			if( ( x ) == 0 )						\
				vAssertCalled( __FILE__, __LINE__ );\
		} while (0)
#endif

/* Optional functions */
#define INCLUDE_vTaskPrioritySet					0
#define INCLUDE_uxTaskPriorityGet					0
#define INCLUDE_vTaskDelayUntil						1
#define INCLUDE_vTaskDelay							1
#define INCLUDE_vTaskDelete							1
#define INCLUDE_vTaskSuspend						1

// #define ENABLE_TRACE

#if defined(ENABLE_TRACE)
#include "trace.h"
#endif

Прошу помочь разобраться, идей уже нет

 

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


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

Во первых созранение и восстановление стека в TCB в portSAVE_CONTEXT и portRESTORE_CONTEXT надо делать только при 0 в uxInterruptNesting (но это не должно ломать первую таску)

19 hours ago, addi II said:

далее ухожу в исключение

Проверте что в этот моент лежит в pxCurrentTCB (не NULL ли случаем). И если нет, что лежит в первом слове этой струкутры (pxStack), опять же не NULL и совпадает ли с тем, что вы инициализировали в pxPortInitialiseStack

uxInterruptNesting проверте перед входом в vPortStartFirstTask - должен быть 1

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


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

Спасибо, не совсем понял про нестинг, я предполагал что по умолчанию 0 а в прологе любого прерывания +1

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


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

19 minutes ago, addi II said:

Спасибо, не совсем понял про нестинг, я предполагал что по умолчанию 0 а в прологе любого прерывания +1

Когда вы стартуете первую таску система должна думать, что вы возвращаетесь из прерывания верхнего уровня, т.к. только там происходит переключение тасков. Так что при входе в vPortStartFirstTask нестинг должен бьть 1

 

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


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

Спасибо за поддержку!
Я посмотрел что у меня и сделал сделал следующую проверку(debug режим специфический):

    /* Start Counting */
	mips_biscr(CR_DC);
    if(uxInterruptNesting)
    *((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0x1234; // проверка 
	else
	*((volatile uint16_t* const)(IOP1_BASE + 0x04)) = 0x4321; // проверка 
	vPortStartFirstTask();
	asm("nop");

которая показала 0x4321

И еще хотел спросить, никак не могу понять
Согласно структуре TCB - Top of stack считается относительно -portCONTEXT_SIZE или xISRStackTop или uxSavedTaskStackPointer??

image.thumb.png.1ed3770d9891fabfba8ab0c8edd315b4.png

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


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

5 hours ago, addi II said:

которая показала 0x4321

Т.е. у вас в uxInterruptNesting ноль. Присвойте 1

5 hours ago, addi II said:

Согласно структуре TCB - Top of stack считается относительно -portCONTEXT_SIZE или xISRStackTop или uxSavedTaskStackPointer??

Первое скорее. В общем там лежит sp мз пользовательской таски. Но может лежать и нечто смещённое - это от вас зависит (точнее от port.c и пр). Именно port часть обрабатывает его.

В любом случае это точно НЕ xISRStackTop - это стек прерываний, он никогда в TCB не пишется

А uxSavedTaskStackPointer это вообше не понятно что такое, нечто сугубо внутренее для оригинального port (откуда вы его брали). Посмотрите, где он ещё используется. Возможно он вообще не нужен.

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


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

Спасибо, установил вместо 0 в port.c

/* Records the interrupt nesting depth. - unused currently as no int stack */
volatile UBaseType_t uxInterruptNesting = 0x1;///

и отладка показывает теперь 0x1234, но таск не запускается, и вижу что первого прерывания, -  по таймеру(для переключения тиков)

застрял по счетчику команд вот здесь:

	vTaskStartScheduler();
ffffffffb500ec7c:	0d4040c1 	jal	ffffffffb5010304 <vTaskStartScheduler>
ffffffffb500ec80:	00000000 	sll	$0,$0,0x0
ffffffffb500ec84:	00000000 	sll	$0,$0,0x0

	///("WARNING! This point in main must not be reached!\n");
	// If all is well we will never reach here as the scheduler will now be
	//running.  If we do reach here then it is likely that there was insufficient
	//heap available for the idle task to be created. 
	for( ;; );
ffffffffb500ec88:	1000ffff 	beqz	$0,ffffffffb500ec88 <main+0x110>
ffffffffb500ec8c:	00000000 	sll	$0,$0,0x0
ffffffffb500ec90:	00000000 	sll	$0,$0,0x0

ffffffffb500ec94 <FillTask>:

ec88, ec90, ec94 в бесконечном цикле

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


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

У вас vTaskStartScheduler вернулся, а не должен был. Вместо него дожна быпа запустится первая таска. К вас есть отладчик? (По JTAG например). Можете по шагам пройти запуск?

 

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


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

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

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

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

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

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

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

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

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

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