BRTOS: estrutura e gerenciamento de memória

144 views
Skip to first unread message

Gênesis Ribeiro Leite

unread,
Nov 22, 2012, 7:25:06 PM11/22/12
to br...@googlegroups.com
Boa noite comunidade RTOS,

       Estou fazendo um trabalho sobre RTOS, contudo preciso de informações de como funciona o gerenciamento de memória do sistema e como é sua estrutura (imagens e eou descrições mais detalhadas são bem-vindas). Tenho certa urgência, pois precisarei da informação para seminário no dia 01/12. Na certeza do atendimento, antecipo-lhes meus agradecimentos.

Atenciosamente,

          Gênesis

Gustavo Denardin

unread,
Nov 23, 2012, 8:15:59 AM11/23/12
to br...@googlegroups.com
Olá Genesis,

Eu não entendi se você está falando sobre o gerenciamento de memória de RTOSes em  geral ou do BRTOS.

Em geral o kernel de um RTOS aloca memória RAM cada vez que uma tarefa, fila, mutex, software timers, semaforos, etc. são criados. Se você perguntou com relação ao BRTOS, o sistema tem uma proposta bem simples. O usuário deve definir em tempo de compilação a memória disponível para tarefas (a ser utilizada para o stack de cada tarefa) e a quantidade máxima de semáforos, mutex, etc, que serão alocados antecipadamente. Quando uma tarefa necessita criar um semáforo, o kernel do sistema cede um dos semáforos disponíveis para está tarefa, ou seja, a alocação não é dinâmica (ou pelo menos não segue a definição padrão de alocação dinâmica). No caso das filas, foi realizada uma modificação na versão 1.7x para suportar alocação dinâmica, que deve ser implementada a parte ou utilizar as funções malloc e free disponíveis para um determinado sistema.

Quanto as tarefas, após serem instaladas, ainda não há maneiras de desinstalá-las e devolver a memória para o kernel. A idéia inicial do BRTOS não contemplava instalar e desinstalar tarefas dinamicamente. No futuro, pretendemos criar um procedimento de instalação para tarefas que permita está funcionalidade.

Existem outros sistemas RTOS que permitem a alocação dinâmica de memória de diferentes formas, como por exemplo o FreeRTOS. Segue link:

Espero ter ajudado,
Abraço,
Gustavo



--
Você está recebendo esta mensagem porque se inscreveu no grupo "BRTOS" dos Grupos do Google.
Para ver esta discussão na web, acesse https://groups.google.com/d/msg/brtos/-/V5W5u8w5dikJ.
Para postar neste grupo, envie um e-mail para br...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para brtos+un...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/brtos?hl=pt-BR.



Miguel Moreto

unread,
Mar 6, 2015, 1:52:47 PM3/6/15
to br...@googlegroups.com
Olá Gustavo e Barriquelo,

Vou aproveitar esse post antigo mesmo para postar uma dúvidas relacionadas com alocação dinâmica de memória.

É possível lidar com alocação dinâmica de memória em uma tarefa (função malloc no ARM GCC)?

Na hora do "InstallTask" vou ter que prever a memória a ser usada pela função malloc e indicar esse valor no tamanho do stack da tarefa?

Por exemplo:

se eu instalar uma tarefa com 512 bytes the stack

InstallTask(&Task_KeyDebounce,"Key debounce",512,3,NULL)

e no código eu alocar com a função malloc, digamos, 1024 bytes de memória, o que acontecerá?

Caso isso não funcione, seria possível alocar um bloco grande de memória, digamos assim, "fora" do sistema operacional?

Como lidar com essas situações usando o BRTOS.

Saudações,

Miguel Moreto

Carlos Henrique Barriquello

unread,
Mar 6, 2015, 2:12:56 PM3/6/15
to br...@googlegroups.com
Tudo bom Miguel?

a função malloc padrão utiliza um bloco de memória conhecido com heap, cujo tamanho é definido no arquivo de linker. Portanto, você pode utilizá-la normalmente nas tarefas sem precisar alocar mais memória. A memória que você aloca no BRTOS para a tarefa é a "stack" da tarefa e não é utilizada pela função malloc.

Claro que se você alocar memória para o heap vai consumir uma parte da memória RAM e vai sobrar menos para alocar como STACK do sistema, que é bloco utilizado pelo BRTOS para ser usado com as tarefas... 

Abraço,



--
Você recebeu essa mensagem porque está inscrito no grupo "BRTOS" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para brtos+un...@googlegroups.com.
Para postar nesse grupo, envie um e-mail para br...@googlegroups.com.
Acesse esse grupo em http://groups.google.com/group/brtos.
Para mais opções, acesse https://groups.google.com/d/optout.

Gustavo Weber Denardin

unread,
Mar 7, 2015, 10:30:24 AM3/7/15
to br...@googlegroups.com
Olá Miguel. A explicação do Carlos está perfeita, a alocação dinâmica usada pelo malloc é independente do stack da tarefa. No entanto, vou fazer uma recomendação.

As funções malloc e free não tem proteção para ambiente multitarefa. Assim, se você as utilizar em mais de uma tarefa, proteja seu acesso com um mutex ou bloqueio de interrupções.

Abraço,
Gustavo

De: Miguel Moreto
Enviada em: ‎06/‎03/‎2015 15:53
Para: br...@googlegroups.com
Assunto: Re: [BRTOS] BRTOS: estrutura e gerenciamento de memória

Gustavo Weber Denardin

unread,
Mar 7, 2015, 11:27:59 AM3/7/15
to br...@googlegroups.com
Olá Miguel. A explicação do Carlos está perfeita, a alocação dinâmica usada pelo malloc é independente do stack da tarefa. No entanto, vou fazer uma recomendação.

As funções malloc e free não tem proteção para ambiente multitarefa. Assim, se você as utilizar em mais de uma tarefa, proteja seu acesso com um mutex ou bloqueio de interrupções.

Abraço,
Gustavo

De: Miguel Moreto
Enviada em: ‎06/‎03/‎2015 15:53
Para: br...@googlegroups.com
Assunto: Re: [BRTOS] BRTOS: estrutura e gerenciamento de memória

Miguel Moreto

unread,
Mar 7, 2015, 4:15:11 PM3/7/15
to br...@googlegroups.com
Carlos, muito obrigado! eu não sabia disso, já tinha ouvido falar de heap e stack mas tenho que estudar melhor esses conceitos, não tenho bem claro qual a diferença entre eles.

Gustavo, só uma tarefa é que vai acessar essa memória, então não tem problema.

Mas tenho uma dúvida que talvez possam me ajudar (se acharem off-topic podem responder em privado ou abro um novo tópico):

Como faço para que uma vetor, alocado com malloc dentro de uma função seja visível para outras funções no mesmo arquivo?

Por exemplo, em uma função init() eu aloco a memória com malloc e escrevo os dados que necessito lá. Em outra função int read(int posicao) eu quero ler um determinado elemento desse vetor. Posso salvar o ponteiro que a função malloc retorna em uma variável global? Ao sair da função init() os dados que eu escrevi lá estão seguros (garantidos) desde que eu não execute a função free()?

Saudações!

Miguel
--

Miguel Moreto

Carlos Henrique Barriquello

unread,
Mar 8, 2015, 9:05:55 AM3/8/15
to br...@googlegroups.com
Sim Miguel, você pode guardar o ponteiro em uma variável global.

At,
Carlos
Reply all
Reply to author
Forward
0 new messages