inventor 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Делаю прогу FreeRTOS для STM32F103xB сделал несколько задач - в самом начале ПЕРЕД запуском задач подаю импульс на определенные ноги /* Включение модуля */ void board_power_on(void) { GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); delay_ms(25); GPIO_WriteBit(GPIOB, GPIO_Pin_1, Bit_SET); delay_ms(25); } Вылетает на первой задержке в Hard fault - почему, не могу понять. Есть какие нибудь соображения? Задержку сделал так: IDEF void UtilsDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne.n UtilsDelay\n"); } #define delay_us(x) UtilsDelay(8 * x) #define delay_ms(x) UtilsDelay(8000 * x) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Задержку сделал так А как оно выглядит в дизассемблированном виде? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 3 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Вылетает на первой задержке в Hard fault - почему, не могу понять. Есть какие нибудь соображения? вероятно, не включили тактирование порта Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба вероятно, не включили тактирование порта вроде разобрался в самом начале перед вызовом функции с задержкой включал SysTimer (не понянятно зачем - взял из примеров) а этот таймер вполне вероятно юзал R0 пока я задержку выполнял отключил вызов SysTick_Config(SystemFrequency / 1000) - заработало но это все равно не решение, так как эту задержку нельзя использовать в функциях внутри OC - попробую сделать так чтобы ОС задействовала vApplicationTickHook или IdleHook Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба а этот таймер вполне вероятно юзал R0 пока я задержку выполнял Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло. Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло. Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания. как сделать задержку ДО инициализации в системе xPortSysTickHandler Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main() Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба как сделать задержку ДО инициализации в системе xPortSysTickHandler Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска? Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба как сделать задержку ДО инициализации в системе xPortSysTickHandler Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main() Зачем вообще что-то делать ДО инициализации системы? Инициализируете систему по минимуму, хоть просто одна IdleTask, и уже в этой Idle поднимаете все, что угодно. После чего заменяете IdleTask на штатное. Я инициализирую в минимуме к Idle еще консольную задачу и потом уже подъем остального идет уже под контролем с диагностическими распечатками. Системая задержка, правда, в штатной реализации FreeRTOS в IdleTask не работает, но это легко лечится. //------------------------------------------------------------ // //------------------------------------------------------------ void main( void ) { .... vSetIdleHook( init_system ); // Start the scheduler. vTaskStartScheduler( SYSTIMER_INTERNAL ); } //------------------------------------------------------------ // //------------------------------------------------------------ void init_system() { ....... vSetIdleHook( NULL ); } #define vSmartDelay_ms(x) vSmartDelay( (x)/configTICK_MS ) //------------------------------------------------------------ // //------------------------------------------------------------ void vSmartDelay( portTickType xTicksToDelay ) { if( pxCurrentTCB->uxPriority == 0 ) vDummyDelay( xTicksToDelay ); else vTaskDelay( xTicksToDelay ); } //------------------------------------------------------------ // For use in IDLE Task and ..... //------------------------------------------------------------ void vDummyDelay( portTickType xTicksToDelay ) { portTickType xTimeToWake; if( xTicksToDelay > ( portTickType )0 ) { // Calculate the time to wake - this may overflow but this is // not a problem. xTimeToWake = xTickCount + xTicksToDelay + 1; while( !xIsTimeout( xTimeToWake) ); // Dummy Wait } } Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска? Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам. Для универсальности тогда нужно еще и IdleTask определять. Но на самом деле, как писал выше, не вижу никакой необходимости в задержках до старта системы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
inventor 0 30 ноября, 2015 Опубликовано 30 ноября, 2015 · Жалоба спасиб, щас переделаю Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться