rsystem.c

来自「最新版IAR FOR ARM(EWARM)5.11中的代码例子」· C语言 代码 · 共 147 行

C
147
字号
//-----------------------------------------------------------------------------
// RSYSTEM
//-----------------------------------------------------------------------------
#include "rsystem.h"
#include "hal_uart.h"
#include <stdlib.h>
#include <string.h>

//-----------------------------------------------------------------------------
void rDiagMessage (const char * Msg)
{
  static u8 init = 0;

  if (init == 0)
  {
    UART_Init            ();
    UART_BaudRate_Config (9600);
    UART_CR_Config       (UART_MODE,UART_8BIT_DATA);
    UART_CR_Config       (UART_STOPBIT,UART_1_STOPBIT);
    UART_CR_Config       (UART_PARITY,UART_NO_PARITY);
    UART_CR_OnOffConfig  (UART_RX_ENABLE,ENABLE);
    UART_CR_OnOffConfig  (UART_FIFO_ENABLE,ENABLE);
    UART_CR_OnOffConfig  (UART_RUN,ENABLE);
    init = 1;
  }

  UART_StringSend ((vu8*)Msg);
}

//-----------------------------------------------------------------------------
void rExit (const char * Msg)
{
  rDiagMessage (Msg);
  exit(1);
}

//-----------------------------------------------------------------------------
void * rmalloc (u32 Size, const char * Msg)
{
  if (Size == 0)
    return (0);

  void * Result = malloc(Size);

  if (Result == NULL)
  {
    rDiagMessage("rmalloc: Out of memory.");
    rDiagMessage(Msg);
    exit(1);
  }

  memset(Result,0,Size);
  return (Result);
}

//-----------------------------------------------------------------------------
void rfree (void * Memory)
{
  free(Memory);
}

//-----------------------------------------------------------------------------
#define HOW_MANY_UNITS 32

#pragma data_alignment=16
static u8 memory16B[16*HOW_MANY_UNITS];

#pragma data_alignment=4
static vu8 memory16Block[HOW_MANY_UNITS];

//-----------------------------------------------------------------------------
void * rmalloc16B (const char * Msg)
{
  u8 i;
  void * Result = NULL;

  for (i=0;i<HOW_MANY_UNITS;i++)
    if (memory16Block[i] == 0)
    {
      memory16Block[i] = 1;
      Result = (void*)(&memory16B[16*i]);
      memset(Result,0,16);
      return (Result);
    }

  if (Result == NULL)
  {
    rDiagMessage("rmalloc16B: Out of memory.");
    rDiagMessage(Msg);
    exit(1);
  }

  return (Result);
}

//-----------------------------------------------------------------------------
void rfree16B (void * Memory)
{
  u8 i;

  for (i=0;i<HOW_MANY_UNITS;i++)
    if (&memory16B[16*i] == Memory)
    {
      memory16Block[i] = 0;
      return;
    }
}

//-----------------------------------------------------------------------------
#pragma data_alignment=256
static u8 memory256B[256];

#pragma data_alignment=4
static vu8 memory256Block = 0;

//-----------------------------------------------------------------------------
void * rmalloc256B (const char * Msg)
{
  void * Result = NULL;

  if (memory256Block == 0)
  {
     Result = (void*)(&memory256B);
     memory256Block = 1;
     memset(Result,0,256);
     return (Result);
  }

  if (Result == NULL)
  {
    rDiagMessage("rmalloc256B: Out of memory.");
    rDiagMessage(Msg);
    exit(1);
  }

  return (Result);
}

//-----------------------------------------------------------------------------
void rfree256B (void * Memory)
{
  if (Memory == &memory256B)
    memory256Block = 0;
}

//-----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?