Jump to content

    

ПО зависает если configTOTAL_HEAP_SIZE больше 5 кБ

Добрый день, коллеги!

 

При создании двух простых задач (каждая мигает светодиодом с определенным интервалом) возникла следующая проблема:

 

Когда в фале FreeRTOSConfig прописаны следующие значения:

 

#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 10 * 1024 ) )

т.е выделяется 10кБ оперативной памяти, программа переходит в бесконечный цикл см. рисунок

 

post-60808-1423723030_thumb.png

 

поскольку R15 не равно R12. Но стоит остановить работу сторожевого таймера "вручную" из отладчика - программа начинает работать.

 

Меняю настройки на:

#define configTOTAL_HEAP_SIZE			( ( size_t ) ( 4 * 1024 ) )

Все работает, т.е если куча больше 5кБ - программа не работает.

 

Из описания на МК следует что у него доступно 32кБ RAM.

 

В чем может быть проблема?

 

 

 

 

 

Share this post


Link to post
Share on other sites

Как бы очень мало инфы... Если это разминка, то кидайте архив проекта, постараюсь посмотреть.

Единственно что могу сказать что 4к очень мало, ОС наверное совсем не адекватно работает при таком кол-ве кучи и соответственно улетает не туда, а вот что происходит при 10к, сказать не могу.

Edited by seniorandre

Share this post


Link to post
Share on other sites

AlexFTF,

в IAR можно попробовать посмотреть call stack.

 

seniorandre,

4к для кучи это не мало

Share this post


Link to post
Share on other sites
Как бы очень мало инфы... Если это разминка, то кидайте архив проекта, постараюсь посмотреть.

Единственно что могу сказать что 4к очень мало, ОС наверное совсем не адекватно работает при таком кол-ве кучи и соответственно улетает не туда, а вот что происходит при 10к, сказать не могу.

 

В том то и дело что при куче меньше 5к все работает.

В приложении папка с проектом.

Буду рад если посмотрите.

Blinc2.rar

 

AlexFTF,

в IAR можно попробовать посмотреть call stack.

 

seniorandre,

4к для кучи это не мало

 

Простите за безграмотность, я начинающий :) что такое call stack?

Share this post


Link to post
Share on other sites
Простите за безграмотность, я начинающий :) что такое call stack?

В меню view / call stack. Там можно поглядеть цепочку вызовов.

Share this post


Link to post
Share on other sites
Как бы очень мало инфы... Если это разминка, то кидайте архив проекта, постараюсь посмотреть.

Единственно что могу сказать что 4к очень мало, ОС наверное совсем не адекватно работает при таком кол-ве кучи и соответственно улетает не туда, а вот что происходит при 10к, сказать не могу.

Проект посмотрел, особого криминала не нашел. Правда я не работал ни с msp430 ни с IAR.

Обычно когда на STM начинаю проект, то я первым делом делаю обвязку для отлова ошибок, что-то вроде вот этого Пример, но Вам придется сделать это под себя. Правда обычно достаточно стек вызовов посмотреть если вы попадаете в отладчик.

Share this post


Link to post
Share on other sites

Проблема разрешилась.

 

Оказывается, если в приложении выделяется больше 4кБ памяти то система просто не успевает проинициализировать выделенную кучу из-за того что срабатывает сторожевой таймер. Решение проблемы следующее:

1. Скопировать файл "low_level_init.c" (from ...\430\src\lib\) в директорию с проектом.

2. Включить этот файл в проект.

3. В файле low_level_init.c добавить заголовочный файл с описанием регистров МК (в моем случае "msp430.h")

4. В теле функции __low_level_init() добавить строчку:

WDTCTL = WDTPW + WDTHOLD;

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this