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:
-
Alocar uma partição: NU_Allocate_Partition () . Implementado por NUSE_Partition_Allocate () no Núcleo SE.
-
Desalocar uma partição: NU_Deallocate_Partition () . Implementado por NUSE_Partition_Deallocate () no Núcleo SE.
-
Forneça informações sobre um pool de partição especificado: NU_Partition_Pool_Information () . Implementado por NUSE_Partition_Pool_Information () no Núcleo SE.
-
Retorne uma contagem de quantos pools de partição estão (atualmente) configurados para o aplicativo: NU_Established_Partition_Pools () . Implementado por NUSE_Partition_Pool_Count () no Núcleo SE.
-
Adicionar um novo pool de partição ao aplicativo (criar): NU_Create_Partition_Pool () . Não implementado no Nucleus SE.
-
Remover um pool de partição do aplicativo (excluir): NU_Delete_Partition_Pool () . Não implementado no Nucleus SE.
-
Retornar ponteiros para todos os pools de partição (atualmente) no aplicativo: NU_Partition_Pool_Pointers () . Não implementado no Nucleus SE.
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
- Uma introdução ao aço inoxidável e como ele é feito
- Termos e conceitos de memória digital
- Entrada e saída básica em C#
- Gerenciamento de memória C++:novo e excluir
- Caixas de correio:introdução e serviços básicos
- Semáforos:serviços utilitários e estruturas de dados
- Semáforos:introdução e serviços básicos
- Grupos de sinalizadores de evento:introdução e serviços básicos
- Filas:introdução e serviços básicos
- Rutronik e AP Memory assinam acordo de distribuição global