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

 
 
> Стек main после запуска планировщика
glonium
сообщение Feb 26 2014, 15:10
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Доброго времени суток всем!
Использую в своём проекте freeRTOS на stm32 компилятор Keil.
Вот недавно столкнулся с особенностью что после запуска планировщика из main портиться итек main, то есть при попытке обратиться к локальным переменным main типа класс с виртуальными функциями внутри по заданному адресу из задачи ввалимся в HardFault_Handler. При анализе обнаружил мусор по адресу данной переменной хотя адрес верный и до запуска планировщика было всё нормально. Кто нибудь сталкивался почему портиться стек main?

Сейчас выяснил что стек портиться после вызова функции:
Код
__asm void vPortStartFirstTask( void )
{
    PRESERVE8

    /* Use the NVIC offset register to locate the stack. */
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]
    /* Set the msp back to the start of the stack. */
    msr msp, r0
    /* Globally enable interrupts. */
    cpsie i
    /* Call SVC to start the first task. */
    svc 0
    nop
}


Я просто в асме не очень кто нибудь подскажите что тут твориться?

Сообщение отредактировал glonium - Feb 26 2014, 14:59
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
glonium
сообщение Feb 26 2014, 18:06
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 77
Регистрация: 27-05-11
Пользователь №: 65 303



Спасибо за ответы!
Буду разбираться, впринципе static помогает!

Разобрался!
В упор не видел!
Код
    /* Use the NVIC offset register to locate the stack. */
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]
    /* Set the msp back to the start of the stack. */
    msr msp, r0

восстанавливает верхушку стека таким образом сбрасывая её!
Всем спасибо большое за помощь!
Думаю тему можно считать исчерпанной!
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 26 2014, 21:43
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(glonium @ Feb 26 2014, 22:06) *
Буду разбираться, впринципе static помогает!

static - тоже что и глобальная переменная. Может так и объявить?
Цитата(glonium @ Feb 26 2014, 22:06) *
Код
    /* Use the NVIC offset register to locate the stack. */
    ldr r0, =0xE000ED08
    ldr r0, [r0]
    ldr r0, [r0]
    /* Set the msp back to the start of the stack. */
    msr msp, r0

И что там было? Можно ведь понятней писать...Нужно стремится к этому.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Feb 28 2014, 05:06
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(_Артём_ @ Feb 27 2014, 03:43) *
И что там было? Можно ведь понятней писать...Нужно стремится к этому.

Там MAIN стек переставляют в начало перед запуском оси. Чтоб стек зря не пропадал. После старта оси этот стек будет использоваться для прерываний.
Им не пришло в голову, что кто-то перед запуском оси может завести локальные переменные на стеке и потом работать с ними.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 08:20
Рейтинг@Mail.ru


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