addi II 0 21 февраля, 2023 Опубликовано 21 февраля, 2023 (изменено) · Жалоба Спасибо за поддержку! Получается 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: Загружать явно в нужное значение (и не забыть его созранить и восстеновить в контексте) не совсем понял, читать из тени?? Изменено 21 февраля, 2023 пользователем addi II Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 21 февраля, 2023 Опубликовано 21 февраля, 2023 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба спасибо, а нужно ли инициализировать нулями какую либо секцию линкера?(bss, stack, heap)? Чтобы в рамках FreeRTOS выделение памяти происходило без последствий Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 1 hour ago, addi II said: спасибо, а нужно ли инициализировать нулями какую либо секцию линкера? Эти нет (точнее bss в стартапе нужно нулями прописать. В линкере их инициализирвоанть не надо) 1 hour ago, addi II said: Чтобы в рамках FreeRTOS выделение памяти происходило без последствий bss должен затереть нулями стартап (вы на С пишете, так что неинициализированные глобальнае переменные должны быть нулями при старте - стандарт С никто не отменял). Динамическая память выделется из heap (или откуда вы сами менеджер памяти настроите), в любом случае он (менеджер) к начальному содержимому heap нечуствителен Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 22 февраля, 2023 Опубликовано 22 февраля, 2023 (изменено) · Жалоба Спасибо, я занулил и 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 я почему спрашиваю, потому что пока что все изменения к лучшему не приводят, к нормальной работе планировщика(сейчас вообще таск не запускает, ни один) и похоже это какая то системная ошибка, поэтому я вернулся к линкеру Изменено 22 февраля, 2023 пользователем addi II Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 3 hours ago, addi II said: Спасибо, я занулил и sbss, ничего страшного? Нормально 3 hours ago, addi II said: сейчас вообще таск не запускает, ни один vTaskStartScheduler(); позвали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба 1 hour ago, xvr said: Нормально vTaskStartScheduler(); позвали? угу, в этой части я ничего не трогал, переписываю сейчас (пытаюсь сделать одинаковое смещение всего сохраняемого контекста) только vPortStartFirstTask, pxPortInitialiseStack, portSAVE_CONTEXT, portYIELD_SAVE, portRESTORE_CONTEXT, portYIELD_RESTORE Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 22 февраля, 2023 Опубликовано 22 февраля, 2023 · Жалоба Что-то никак), прошу снова помощи! Вроде все сделал по замечаниям, но в итоге застрял на функции 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 Прошу помочь разобраться, идей уже нет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 февраля, 2023 Опубликовано 23 февраля, 2023 · Жалоба Во первых созранение и восстановление стека в TCB в portSAVE_CONTEXT и portRESTORE_CONTEXT надо делать только при 0 в uxInterruptNesting (но это не должно ломать первую таску) 19 hours ago, addi II said: далее ухожу в исключение Проверте что в этот моент лежит в pxCurrentTCB (не NULL ли случаем). И если нет, что лежит в первом слове этой струкутры (pxStack), опять же не NULL и совпадает ли с тем, что вы инициализировали в pxPortInitialiseStack uxInterruptNesting проверте перед входом в vPortStartFirstTask - должен быть 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 23 февраля, 2023 Опубликовано 23 февраля, 2023 · Жалоба Спасибо, не совсем понял про нестинг, я предполагал что по умолчанию 0 а в прологе любого прерывания +1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 23 февраля, 2023 Опубликовано 23 февраля, 2023 · Жалоба 19 minutes ago, addi II said: Спасибо, не совсем понял про нестинг, я предполагал что по умолчанию 0 а в прологе любого прерывания +1 Когда вы стартуете первую таску система должна думать, что вы возвращаетесь из прерывания верхнего уровня, т.к. только там происходит переключение тасков. Так что при входе в vPortStartFirstTask нестинг должен бьть 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 26 февраля, 2023 Опубликовано 26 февраля, 2023 · Жалоба Спасибо за поддержку! Я посмотрел что у меня и сделал сделал следующую проверку(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?? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 26 февраля, 2023 Опубликовано 26 февраля, 2023 · Жалоба 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 (откуда вы его брали). Посмотрите, где он ещё используется. Возможно он вообще не нужен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
addi II 0 26 февраля, 2023 Опубликовано 26 февраля, 2023 · Жалоба Спасибо, установил вместо 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 в бесконечном цикле Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 26 февраля, 2023 Опубликовано 26 февраля, 2023 · Жалоба У вас vTaskStartScheduler вернулся, а не должен был. Вместо него дожна быпа запустится первая таска. К вас есть отладчик? (По JTAG например). Можете по шагам пройти запуск? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться