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

 
 
 
Reply to this topicStart new topic
> uC/OSII: память, как оно работает?
Koluchiy
сообщение Dec 10 2013, 10:57
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Здравствуйте, уважаемые гуру.
Никогда не работал с RTOS, так что буду задавать дилетантские вопросы.

Поясните пожалуйста, как эта система работает с памятью.
Стек выделяется каждой задаче, его размеры определяются при создании задачи.
Что на тему кучи (Heap)? Она общая для всех задач?

Есть ли какая-то защита памятей задач? (статических и динамических)
Умеет ли эта система работать с MMU? (процессор - NIOSII/f).

Ну и, можно ли как-то определить максимальный размер кучи, выделяемой в ходе работы системы и ее задач?
Задача статистики такой информации вроде не дает. Есть ли другие способы?

Всем заранее спасибо за ответы.
Можно вместо ответов посылать втуда, где читать.
Go to the top of the page
 
+Quote Post
amusin
сообщение Dec 11 2013, 02:28
Сообщение #2


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

Группа: Участник
Сообщений: 120
Регистрация: 2-09-05
Из: Екатеринбург
Пользователь №: 8 165



Цитата(Koluchiy @ Dec 10 2013, 16:57) *
Что на тему кучи (Heap)? Она общая для всех задач?

Да.
Если вы хотите работать с кучей из нескольких задач,
то следует использовать Mutex.

Цитата(Koluchiy @ Dec 10 2013, 16:57) *
Есть ли какая-то защита памятей задач? (статических и динамических)
Умеет ли эта система работать с MMU? (процессор - NIOSII/f).

Не слышал такое про. Но лучше посмотреть порт ОС для этого МК.
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Dec 11 2013, 14:24
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Спасибо за ответы!

Подскажите, как все-таки решать задачу определения необходимого объема памяти? Размеры стеков известны, необходимые размеры куч - нет (сколько-то нужно системе, сколько-то используемым библиотекам).
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Dec 17 2013, 04:56
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Размер кучи можно определить только приблизительно: размещается памяти с запасом и прогоняется программа - потом смотрите, сколько памяти максимум требовалось. Размеры стеков для задач тоже рассчитываются таким методом - автоматического вычисления стека для задач я не встречал.
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Dec 17 2013, 05:58
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Цитата(andrewlekar @ Dec 17 2013, 08:56) *
потом смотрите, сколько памяти максимум требовалось


Нельзя ли подробнее, как можно посмотреть "потом", сколько памяти максимум требовалось?
Это какая-то примочка в отладчике, или в ОС?
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 17 2013, 06:56
Сообщение #6


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Koluchiy @ Dec 17 2013, 07:58) *
Нельзя ли подробнее, как можно посмотреть "потом", сколько памяти максимум требовалось?
Это какая-то примочка в отладчике, или в ОС?


Есть примочки и для Keil-а и для IAR-а которые позволяют смотреть состояния стеков задач uCOS и менеджера памяти.
В принципе задачи и в рабочем режиме могут контролировать свой стек и увеличивать его при необходимости.

В uCOS есть только менеджер разделов памяти с выделением блоков фиксированной длины.
Разделов этих может быть много, но надо всегда напрягаться какую длину назначить блокам.
Эт такой рудимент оставшийся со времен когда в микроконтроллерах было по 2-10 кБ памяти.

В других осях есть нормальные многозадачные malloc и free, например в MQX.
А почему бы вам не изучить MQX? wink.gif
Go to the top of the page
 
+Quote Post
Koluchiy
сообщение Dec 17 2013, 07:17
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 972
Регистрация: 12-04-09
Из: Москва
Пользователь №: 47 543



Цитата(AlexandrY @ Dec 17 2013, 10:56) *
Есть примочки и для Keil-а и для IAR-а которые позволяют смотреть состояния стеков задач uCOS и менеджера памяти.

Как они называются? Я в Eclipse пока нашел только фишку про контроль стека от переполнения.
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Dec 17 2013, 07:30
Сообщение #8


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(Koluchiy @ Dec 17 2013, 09:17) *
Как они называются? Я в Eclipse пока нашел только фишку про контроль стека от переполнения.


Они не называются, просто открываете закладку IAR там где плагины к RTOS и видите uCOS в списке.
Когда входите в отладчик видите меню с разными функциями работы с RTOS.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Dec 17 2013, 08:03
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



У IAR это называется ucOS Plugin. На деле ось вызывает периодически задачу специальную, которая и проверяет заполненность стеков. Можно там запоминать максимум и выдавать его в терминал по запросу. Этот метод может давать неточное значение максимальной заполненности стека, а куча, кажется, вообще не проверяется. Чтобы наверняка, нужно ставить хук на malloc и free и отслеживать, сколько памяти выделилось в пике. Однако куча может фрагментироваться и нужно закладывать раза в 2 больше памяти, чем вычислили. Короче, муторное это занятие.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Oct 4 2014, 09:26
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(andrewlekar @ Dec 17 2013, 14:03) *
Однако куча может фрагментироваться и нужно закладывать раза в 2 больше памяти, чем вычислили. Короче, муторное это занятие.

Почему именно в 2, а не больше?
А если в процессе работы программы была такая последовательность:
выделить 100байт, указатель A;
выделить 1байт, указатель B1;
освободить указатель A;
выделить 101байт, указатель A;
выделить 1байт, указатель B2;
освободить указатель A;
... ну и так далее, с увеличением запросов A и без освобождения указателей B.
Что будет после N таких проходов?
Занято (допустим при N=10) в конце будет всего: 1*10+109 байт.
А кучи израсходовано будет: 1*10+100*10+9.
Итого - куча нужна почти в 10 раз больше, чем максимальный полезно-занятый объём.

PS: Именно поэтому я никогда не использую кучу в своих embedded-проектах.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 19th April 2024 - 22:10
Рейтинг@Mail.ru


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