реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вылетает в HARD fault, в чем может быть причина?
inventor
сообщение Nov 30 2015, 09:30
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Делаю прогу FreeRTOS для STM32F103xB
сделал несколько задач - в самом начале ПЕРЕД
запуском задач подаю импульс на определенные ноги

CODE
/* Включение модуля */
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 - почему,
не могу понять.
Есть какие нибудь соображения?

Задержку сделал так:
CODE

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)

Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2015, 09:57
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(inventor @ Nov 30 2015, 12:30) *
Задержку сделал так

А как оно выглядит в дизассемблированном виде?
Go to the top of the page
 
+Quote Post
megajohn
сообщение Nov 30 2015, 10:00
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 080
Регистрация: 16-11-04
Из: СПб
Пользователь №: 1 143



Цитата(inventor @ Nov 30 2015, 12:30) *
Вылетает на первой задержке в Hard fault - почему,
не могу понять.
Есть какие нибудь соображения?


вероятно, не включили тактирование порта


--------------------
Марс - единственная планета, полностью населенная роботами (около 7 штук).
Go to the top of the page
 
+Quote Post
inventor
сообщение Nov 30 2015, 10:33
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(megajohn @ Nov 30 2015, 13:00) *
вероятно, не включили тактирование порта

вроде разобрался
в самом начале перед вызовом
функции с задержкой
включал SysTimer (не понянятно зачем - взял из примеров)
а этот таймер вполне вероятно юзал R0
пока я задержку выполнял

отключил вызов SysTick_Config(SystemFrequency / 1000) - заработало
но это все равно не решение, так как эту задержку нельзя использовать
в функциях внутри OC - попробую сделать так
чтобы ОС задействовала vApplicationTickHook или IdleHook
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2015, 10:53
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(inventor @ Nov 30 2015, 13:33) *
а этот таймер вполне вероятно юзал R0
пока я задержку выполнял

Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло.

Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания.
Go to the top of the page
 
+Quote Post
inventor
сообщение Nov 30 2015, 11:16
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Цитата(aaarrr @ Nov 30 2015, 13:53) *
Невероятно. То есть использовать-то он его использовал, конечно, но вашей задержке это никак повредить не могло.

Если прерывание системного таймера содержит переход на xPortSysTickHandler, и таймер был разрешен до инициализации ОС, то вылет в Hard Fault имеет все основания.

как сделать задержку ДО инициализации в системе xPortSysTickHandler
Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main()
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 30 2015, 11:32
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(inventor @ Nov 30 2015, 14:16) *
как сделать задержку ДО инициализации в системе xPortSysTickHandler

Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска?
Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 30 2015, 12:05
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (inventor @ Nov 30 2015, 13:16) *
как сделать задержку ДО инициализации в системе xPortSysTickHandler
Я так понимаю это делается где то в функции vTaskStartScheduler() в конце main()

Зачем вообще что-то делать ДО инициализации системы? Инициализируете систему по минимуму, хоть просто одна IdleTask, и уже в этой Idle поднимаете все, что угодно. После чего заменяете IdleTask на штатное. Я инициализирую в минимуме к Idle еще консольную задачу и потом уже подъем остального идет уже под контролем с диагностическими распечатками.
Системая задержка, правда, в штатной реализации FreeRTOS в IdleTask не работает, но это легко лечится.
CODE
//------------------------------------------------------------
//
//------------------------------------------------------------
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
    }
}



QUOTE (aaarrr @ Nov 30 2015, 13:32) *
Я так понимаю, что стоит цель написать универсальную функцию задержки, которая будет работать и в контексте ОС, и до её запуска?
Самый простой способ - проверять в начале функции, запущен ли SysTick, и ветвиться на vTaskDelay() или циклическую задержку по результатам.

Для универсальности тогда нужно еще и IdleTask определять. Но на самом деле, как писал выше, не вижу никакой необходимости в задержках до старта системы.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
inventor
сообщение Nov 30 2015, 12:22
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



спасиб, щас переделаю
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th June 2025 - 01:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01435 секунд с 7
ELECTRONIX ©2004-2016