Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial Internet of Things >> Integrado

Memória da partição - introdução e serviços básicos


Veja a série RTOS Revelado

As partições de memória foram introduzidas em um artigo anterior, onde uma comparação com o C malloc () padrão função foi feita. Uma partição é uma área de memória obtida de um pool de partição. Isso oferece um meio flexível para as tarefas obterem e liberarem o armazenamento de dados de maneira determinística e confiável.

Usando partições

No Nucleus SE, os pools de partição são configurados no momento da construção. Pode haver no máximo 16 pools de partição configurados para um aplicativo. Se nenhum pool de partição for configurado, nenhuma estrutura de dados ou código de chamada de serviço pertencente aos pools de partição será incluído no aplicativo.

Um pool de partição é simplesmente uma área de memória, que é dividida em um número específico de partições de tamanho fixo. O usuário tem controle total sobre o tamanho e o número de partições em cada pool. As tarefas podem solicitar a alocação de partições de memória e receber um ponteiro para a área de armazenamento. É responsabilidade da tarefa não gravar dados fora da partição. A partição pode ser desalocada por qualquer tarefa, passando o ponteiro para uma função API. Solicitar a alocação de uma partição, quando não houver mais disponível, pode resultar em erro ou suspensão da tarefa, dependendo das opções selecionadas na chamada API e da configuração do Nucleus SE.

Configurando partições de memória

Número de pools de partição

Como acontece com a maioria dos aspectos do Nucleus SE, a configuração dos pools de partição é controlada principalmente por #define declarações em nuse_config.h . A configuração principal é NUSE_PARTITION_POOL_NUMBER , que determina quantos pools de partição são configurados para o aplicativo. A configuração padrão é 0 (ou seja, nenhum pool de partição está em uso) e você pode definir qualquer valor até 16. Um valor incorreto resultará em um erro de tempo de compilação, que é gerado por um teste em nuse_config_check.h (isso está incluído em nuse_config.c e, portanto, compilado com este módulo) resultando em um #error declaração sendo compilada.

A escolha de um valor diferente de zero é a “habilitação principal” para pools de partição. Isso resulta em algumas estruturas de dados sendo definidas e dimensionadas de acordo. Estruturas de dados em ROM requerem inicialização para valores adequados que caracterizam cada pool de partição. Mais sobre estruturas de dados no próximo artigo. Ele também ativa as configurações de ativação da API.

Ativa API

Cada função de API (chamada de serviço) no Nucleus SE tem um #define de ativação símbolo em nuse_config.h . Para pools de partição, são:

NUSE_PARTITION_ALLOCATE

NUSE_PARTITION_DEALLOCATE

NUSE_PARTITION_POOL_INFORMATION

NUSE_PARTITION_POOL_COUNT

Por padrão, todos eles são definidos como FALSO , desabilitando cada chamada de serviço e inibindo a inclusão de qualquer código de implementação. Para configurar pools de partição para um aplicativo, você precisa selecionar as chamadas de API que deseja usar e definir seus símbolos de ativação para TRUE .

Aqui está um trecho do padrão nuse_config.h Arquivo:



Um erro de tempo de compilação resultará se uma função API do pool de partição estiver habilitada e nenhum pool de partição estiver configurado (exceto para NUSE_Partition_Pool_Count () que é sempre permitido). Se o seu código usar uma chamada de API, que não foi habilitada, ocorrerá um erro de tempo de link, pois nenhum código de implementação terá sido incluído no aplicativo.

Chamadas de serviço de pool de partição

O Nucleus RTOS oferece suporte a sete chamadas de serviço, que pertencem a pools de partição que fornecem a seguinte funcionalidade:


A implementação de cada uma dessas chamadas de serviço é examinada em detalhes.

Pode-se notar que nenhuma função de redefinição é fornecida (no Nucleus RTOS ou no Nucleus SE). Isso é intencional. É uma prática muito comum para uma tarefa alocar uma partição e passar um ponteiro para outra tarefa (que provavelmente o desalocará mais tarde). Se um pool de partição fosse redefinido, todas as partições seriam marcadas como não utilizadas, mas não há meio de rastrear e notificar todas as tarefas que podem estar usando as partições.

Serviços de alocação e desalocação de partição

As operações fundamentais, que podem ser realizadas em um pool de partição, são alocar uma partição (ou seja, marcar uma partição como usada e retornar seu endereço) e desalocar uma partição (ou seja, marcar uma partição como não usada). O Nucleus RTOS e o Nucleus SE fornecem, cada um, duas chamadas API básicas para essas operações, que serão discutidas aqui.

Alocar uma partição

A chamada da API Nucleus RTOS para alocar uma partição é muito flexível, permitindo suspender indefinidamente, ou com um tempo limite, se a operação não puder ser concluída imediatamente; ou seja, você tenta alocar uma partição de um pool no qual todas as partições estão atualmente alocadas. O Nucleus SE fornece o mesmo serviço, exceto que a suspensão da tarefa é opcional e o tempo limite não é implementado.

Chamada da API Nucleus RTOS para alocação de partição

Protótipo de chamada de serviço:

STATUS NU_Allocate_Partition (NU_PARTITION_POOL * pool,
VOID ** return_pointer, UNSIGNED suspend);


Retorna:

NU_SUCCESS - a chamada foi completada com sucesso

NU_NO_PARTITION - nenhuma partição está disponível

NU_INVALID_POOL - o ponteiro do pool de partição é inválido

NU_INVALID_POINTER - o ponteiro de retorno de dados é NULL

NU_INVALID_SUSPEND - a suspensão foi tentada a partir de um thread sem tarefa

NU_TIMEOUT - nenhuma partição está disponível, mesmo após a suspensão pelo período de tempo limite especificado

NU_POOL_DELETED - pool de partição foi excluído enquanto a tarefa estava suspensa

Chamada de API Nucleus SE para alocação

Esta chamada de API oferece suporte à funcionalidade principal da API Nucleus RTOS.

Protótipo de chamada de serviço:

STATUS NUSE_Partition_Allocate (NUSE_PARTITION_POOL pool, ADDR * return_pointer, U8 suspend);

Parâmetros:

pool - o índice (ID) do pool de partição a ser utilizado

return_pointer - um ponteiro para uma variável do tipo ADDR que receberá o endereço da partição alocada

suspender - especificação para suspensão de tarefa; pode ser NUSE_NO_SUSPEND ou NUSE_SUSPEND

Retorna:

NUSE_SUCCESS - a chamada foi completada com sucesso

NUSE_NO_PARTITION - nenhuma partição está disponível

NUSE_INVALID_POOL - o índice do pool de partição é inválido

NUSE_INVALID_POINTER - o ponteiro de retorno de dados é NULL

NUSE_INVALID_SUSPEND - a suspensão foi tentada a partir de um thread não-tarefa ou quando o bloqueio de chamadas de API não estava habilitado

Integrado

  1. Uma introdução ao aço inoxidável e como ele é feito
  2. Termos e conceitos de memória digital
  3. Entrada e saída básica em C#
  4. Gerenciamento de memória C++:novo e excluir
  5. Caixas de correio:introdução e serviços básicos
  6. Semáforos:serviços utilitários e estruturas de dados
  7. Semáforos:introdução e serviços básicos
  8. Grupos de sinalizadores de evento:introdução e serviços básicos
  9. Filas:introdução e serviços básicos
  10. Rutronik e AP Memory assinam acordo de distribuição global