This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/AM3358:NIMU 集成

Guru**** 2918150 points

Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/664242/rtos-am3358-nimu-integration

器件型号:AM3358
Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

你好、

我已经使用了示例程序"Nimu_BasicExample_bbbAM335x_armExampleProject"并对其进行了修整、因此我在 TCP 端口7上给自己发送了一个很好的"hello"、效果很好。   

我有一个单独的程序正在运行、我正在根据"MCSPI_SlaveMode_MasterExample_bbbAM335x_armExampleProject"从 SPI1总线读取传感器数据、该程序效果很好。

尝试将在我的 Nimu 示例中工作的内容集成到我的 SPI 示例中时、我遇到了一些问题。  

实际上、我在编译合并的项目时没有警告或错误、它会被 BBB 下载到。  问题是、当它尝试运行时、它表示它无法打开套接字、并且所有内容都崩溃。  我实际上已经将我的所有网络代码从程序中取出、程序仍然崩溃。

以下是我工作的 NIMU 代码供参考、以及我尝试将其放入 SPI 代码中的代码:

/*
*版权所有(C) 2015 Texas Instruments Incorporated - http://www.ti.com/
*
*
*以源代码和二进制形式重新分发和使用、有无
*如果满足以下条件、则允许进行修改
符合*:
*
*源代码的重新分发必须保留上述版权
*注意、此条件列表和以下免责声明。
*
*二进制形式的再发行必须复制上述版权
*请注意、中的此条件列表和以下免责声明
*随提供的文档和/或其他材料
*分发。
*
*德州仪器公司的名称和名称均不相同
*其贡献者可用于认可或推广衍生产品
*未经特定的事先书面许可。
*
*本软件由版权所有者和贡献者提供
*"按原样"以及任何明示或暗示的保证、包括但不包括
*仅限于对适销性和适用性的暗示保证
*一项特定目的不予承认。 在任何情况下、版权均不得
*所有者或贡献者应对任何直接、间接、偶然或
*特殊、惩戒性或后果性损害(包括但不包括)
*仅限于采购替代货物或服务;丧失使用、
*数据或利润;或业务中断)
*责任理论、无论是合同责任、严格责任还是侵权行为
*(包括疏忽或其他)因使用而以任何方式产生
*、即使被告知可能会发生此类损坏。
*
*

/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
/*包含文件*/
/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *

#include
#include
#include
#include
#include
#include
#include
#include
#include

#include

#include
#include

#include
#include
#include
#include
#include
#include

#include

/* UART 头文件*/
#include
#include

#include

extern char * LocalIPAddr;

/*启用以下宏以在 IO 控制台上打印*/
//#define IO_console


#ifndef IO_console
#define NIMU_log UART_printf
其他
#define NIMU_log printf
#endif

/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
/*宏*/
/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *

/** CPSW 端口1*/的 PHY 地址
#define EMAC_CPSW_PORT0_PHY_ADDR_EVM 0
/** CPSW 端口1*/的 PHY 地址
#define EMAC_CPSW_Port1_PHY_ADDR_EVM 1.


#define MAX_TABLE 条目3.

/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *
/*全局变量*/
/*==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== *


/** EIP 的任务句柄*/
Task_handle main_task;

静态 int nimu_device_index = 0U;


NIMU_DEVICE_TABLE 项 NIMUDeviceTable[MAX_TABLE 项];

void TaskFxn (UArg a0、UArg A1);
extern int CpswEmacInit (STKEVENT_Handle hEvent);


/**
*\name main
*\brief 主功能
*\param none
*\不返回任何内容
*
*
int main()

/*呼叫板初始化函数*/
board_initCfg boardCfg;
Task_Params taskParams;
EMAC_HwAttrs_V4 cfg;

boardCfg = Board_init_PINMUX_CONFIG |
Board_init_module_clock | Board_init_uart_stdio;
board_init (boardCfg);

/*芯片配置 MII/RMII 选择*/
SOCCtrlCpswPortMacModeSelect (1、Ethernet_MAC_TYPE_MII);
SOCCtrlCpswPortMacModeSelect (2、Ethernet_MAC_TYPE_MII);

EMAC_socGetInitCfg (0、&cfg);
cfg.port[0].phy_addr = EMAC_CPSW_PORT0_PHY_ADDR_EVM;
cfg.port[1].phy_addr = EMAC_CPSW_PORT0_PHY_ADDR_EVM;
cfg.macModeFlags = EMAC_CPSW_CONFIG_MODEFLG_FULLDUPLEX;
EMAC_socSetInitCfg (0、&cfg);

Task_Params_init (&taskParams);
taskParams.priority = 1;
taskParams.STACKSIZE = 0x1400;
main_task = Task_create (TaskFxn、&taskParams、NULL);

NIMUDeviceTable[NIMU_DEVICE_index++].init =&CpswEmacInit;
NIMUDeviceTable[NIMU_DEVICE_index].init = NULL;

BIOS_start();

返回-1;

/**
*\name TaskFxn
*\brief 执行 EIP 初始化的任务
*\param a0
*\param A1
*\不返回任何内容
*
*
空 TaskFxn (UARg a0、UARg A1)

NIMU_log ("\n\rSYS/BIOS EtherNet/IP (CPSW)示例应用、EVM IP 地址:%s\n\r\n、LocalIPAddr);

套接字 s = invalid_socket;
struct sockaddr_in sin1;
char *pBuf = 0;
结构时间值超时;

//为此任务分配文件描述符环境
fdOpenSession((Handle)Task_sele());
printf ("\n==启动 TCP 回显客户端测试=\n");

//创建测试套接字
S =套接字(AF_iNet、SOCK_STREAM、IPPROTO_TCP);
if (s =invalid_socket)

printf ("失败的套接字创建(%d)\n"、fdError());
离开;

否则{
printf ("创建的套接字\n");

char * ipaddr ="192.168.1.6";
//准备连接地址
bzero (&sin1、sizeof (struct sockaddr_in)));
Sin1.Sin_Family = AF_iNet;
sin1.sin addr.s_addr = inet_addr (ipaddr);
sin1.sin_port = htons (7);

//将 Tx 和 Rx 超时配置为5秒
timeout.tv_sec = 5;
timeout.tv_usec = 0;
setsockopt( s、SOL_socket、SO_SNDTIMEO、&timeout、sizeof( timeout ));
setsockopt( s、SOL_socket、SO_RCVTIMEO、&TIMEOUT、sizeof( timeout ));

//连接套接字
if (connect( s,(PSA)&sin1, sizeof (sin1))<0)

printf ("连接失败(%d)\n"、fdError());
离开;

否则{
printf ("已连接\n");

//分配一个有效的缓冲区
if (!(pBuf = malloc( 4096)))

printf ("温度缓冲区分配失败\n");
离开;

//用测试模式填充缓冲区
// for (i=0;i<4096;i++)
*(pBuf+0)=(char)'h';
*(pBuf+1)=(char)'e';
*(pBuf+2)=(char)'l';
*(pBuf+3)=(char)'l';
*(pBuf+4)=(char)'o';


//发送缓冲区
if (send( s、pBuf、5、0 )<0)

printf ("发送失败(%d)\n"、fdError());
离开;

否则{
printf ("已发送");


休假:
if (pBuf)
FREE( pBuf );

if (s!= invalid_socket)
fdClose (s);

printf ("= End TCP Echo Client Test =\n\n");

//为此任务释放文件描述符环境
fdCloseSession((Handle)Task_sele());

#ifdef Nimu_FTP_app
ftpserver_init();
#endif

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Alex:

    您是否合并了.cfg 文件来分配适当的堆栈/堆大小并管理存储器的可高速缓存性?

    这些提示可能有助于解决您发现的崩溃问题:
    processors.wiki.ti.com/.../Processor_SDK_RTOS:_TI_RTOS_Tips_And_Tricks
    processors.wiki.ti.com/.../Processor_SDK_RTOS:_TI_RTOS_Tips_And_Tricks

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的.cfg 文件。 我有大量的堆和堆栈是出于其他原因、因此这不应该成为问题。

    忽略我刚才评论过的 UIA 内容-这是一个不同的问题。

    /**
    *\file spi_arm_bbbAM335x_slavemode.cfg
    *
    *\brief 针对 AM335X BBB EVM 上 MCSPI 示例项目的 SYSBIOS 配置文件。
    *
    *

    /*
    *版权所有(C) 2016德州仪器(TI)公司- http://www.ti.com/
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    *源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随提供的文档和/或其他材料
    *分发。
    *
    *德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"以及任何明示或暗示的保证、包括但不包括
    *仅限于对适销性和适用性的暗示保证
    *一项特定目的不予承认。 在任何情况下、版权均不得
    *所有者或贡献者应对任何直接、间接、偶然或
    *特殊、惩戒性或后果性损害(包括但不包括)
    *仅限于采购替代货物或服务;丧失使用、
    *数据或利润;或业务中断)
    *责任理论、无论是合同责任、严格责任还是侵权行为
    *(包括疏忽或其他)因使用而以任何方式产生
    *、即使被告知可能会发生此类损坏。
    *
    *
    /*========================= 常规配置=================== *
    VAR 默认值= xdc.useModule('xdc.runtime.Defaults');
    VAR 诊断= xdc.useModule('xdc.runtime.Diags');
    VAR 错误= xdc.useModule('xdc.runtime.Error');
    VAR Main = xdc.useModule('xdc.runtime.Main');
    VAR 内存= xdc.useModule('xdc.runtime.Memory')
    VAR SysMin = xdc.useModule('xdc.runtime.SysMin');
    VAR 系统= xdc.useModule('xdc.runtime.System');
    var text = xdc.useModule('xdc.runtime.Text');
    VAR 时钟= xdc.useModule('ti.sysbios.knl.Clock');
    VAR Swi = xdc.useModule('ti.sysbios.knl.Swi');
    VAR 任务= xdc.useModule('ti.sysbios.knl.Task');
    VAR 信标= xdc.useModule('ti.sysbios.knl.Semaphore');
    VAR Hwi = xdc.useModule('ti.sysbios.hal.Hwi');
    VAR 计时器= xdc.useModule('ti.sysbios.hal.Timer');
    VAR HeapMem = xdc.useModule('ti.sysbios.heaps.HeapMem');
    VAR SemihostSupport = xdc.useModule('ti.sysbios.rts.gnu.SemiHostSupport');
    VAR Global = xdc.useModule('ti.ndk.config.Global');
    //var Log = xdc.useModule('xdc.runtime.Log');
    //var LoggerBuf = xdc.useModule('xdc.runtime.LoggerBuf');

    VAR Global = xdc.useModule('ti.ndk.config.Global');
    VAR TCP = xdc.useModule('ti.ndk.config.Tcp');
    VAR IP = xdc.useModule('ti.ndk.config.Ip');

    /*
    * Program.argSize 设置.args 段的大小。
    *示例不使用命令行参数,因此 argSize 设置为0。
    *
    program.argSize = 0x0;


    /*系统堆栈大小(由 ISR 和 Swi 使用)*/
    program.stack = 6000000;

    /*
    *取消注释此行以全局禁用断言。
    *所有模块继承'库'模块的默认值。 您
    *可以使用 Module.common$按模块覆盖这些默认值。
    *禁用断言将节省代码空间并提高运行时性能。
    Defaults.common$.diags_ASSERT = Diags.always_off;
    *
    Defaults.common$.diags_ASSERT = Diags.always_on;

    /*
    *取消注释此行以防止模块名称加载到目标上。
    *模块名称字符串放置在.const 段中。 设置此值
    *将参数设置为 false 将节省.const 段中的空间。 误差和
    *断言消息将包含"未知模块"前缀
    实际模块名称的*。
    Defaults.common$.namedModule = false;
    *
    Defaults.common$.namedModule = false;

    /*
    *最小化系统中的 EXIT 处理程序数组。 系统模块包括
    *向 System_atexit()注册的函数数数组
    *由 System_exit()调用。
    *
    System.maxAtexitHandlers = 4;

    /*
    *取消注释此行以禁用错误打印功能。
    *禁用此功能时,我们会丢失错误信息,因为错误是这样
    *未打印。 如果禁用 raiseHook、则会节省一些代码空间
    *由于 Error_print()函数,您的应用程序未使用 System_printf()
    *调用 System_printf()。
    error.raiseHook =空;
    *
    error.raiseHook =空;
    /*
    *取消注释此行以防止 Error、Assert 和 Log 字符串成为字符串
    *加载到目标上。 这些字符串放置在.const 段中。
    *将此参数设置为 false 将节省.const 段中的空间。
    *错误、断言和日志消息将打印原始 ID 和 args 而不是
    *格式化的邮件。
    text.isLoaded = false;
    *
    text.isLoaded = false;
    /*
    *取消注释此行以禁用 SysMin 的字符输出
    *程序退出时。 SysMin 向循环缓冲区写入字符。
    *可以使用 ROV 中的 SysMin Output 视图查看该缓冲器。
    *
    SysMin。flushAtExit = false;

    /*
    *为整个系统创建并安装记录器
    *

    /var logerBufParams = new LoggerBuf.Params();
    //loggerBufParams.numEntry = 32;
    /var logger0 = LoggerBuf.create (logerBufParams);
    //Defaults.common$.logger = logger0;
    //Main.common$.diags_INFO = Diags.always_on;

    System.SupportProxy = SysMin;




    VAR Global = xdc.useModule('ti.ndk.config.Global');
    VAR IP = xdc.useModule('ti.ndk.config.Ip');

    Global.netSchedulerPri = Global. nc_priority_high;
    Global.debugAbortLevel = Global. DBG_error;
    Global.debugPrintLevel = Global. DBG_NONE;

    var ti_SysBIOS_hal_Timer = xdc.useModule('ti.sysbios.hal.Timer');
    /*
    /* Global. stackThreadUser ="&NDKACD_stackThread";*/

    VAR TCP = xdc.useModule('ti.ndk.config.Tcp');
    VAR UDP = xdc.useModule('ti.ndk.config.Udp');
    /*
    /*静态 IP 配置的设置*/

    ip.ResolveIP = false;
    ip.CallByIP = false;
    Ip.autoIp = false;
    ip.address ="192.168.1.4";
    ip.mask ="255.255.255.0;
    ip.gatewayIpAddr ="192.168.1.1";


    global.ndkTickPeriod = 200;
    global.kernTaskPriLevel = 11;
    Global.serviceReportHook =空;
    global.ipv6 = false;
    global.pktNumFrameBufs=384;

    tcp.transmitBufSize = 16384;
    tcp.receiveBufSize = 65536;
    tcp.receiveBufLimit=65536;


    /*
    *为整个系统创建并安装记录器
    *
    /*========================= BIOS 配置=================== *

    VAR BIOS = xdc.useModule('ti.sysbios.BIOS');
    BIOS.libType = BIOS.LibType_Custom;
    bios.customCCOpts = bios.customCCopts.replace("-g "、"");
    BIOS.sertsEnabled = true;
    //BIOS.logsEnabled = true;
    BIOS.swiEnabled = true;
    /*
    * BIOS 模块将为系统创建默认堆。
    *指定此默认堆的大小。
    *
    BIOS.heapSize = 6000000;

    Swi.common$.namedInstance = true;
    Program.sectionsExclude ="..*";

    clock.tickPeriod = 1000;
    hwi.dispatcherSwiSupport = true;
    hwi.dispatcherTaskSupport = true;
    hwi.dispatcherAutoNestingSupport = true;

    task.enableIdleTask = true;
    Task.initStackFlag = true;
    Task.checkStackFlag = true;

    /*========================= 驱动程序配置=================== *

    /*加载 OSAL 封装*/
    VAR osType ="tirtos";
    VAR OSAL = xdc.loadPackage ('ti.osal');
    OSAL.Settings.osType = osType;

    /*使用 CSL 封装*/
    VAR socType ="AM335x";
    VAR_l = XDC.loadPackage ('ti.CSL');
    Csl.Settings.deviceType = socType;

    /*加载 SPI 包*/
    VAR SPI = xdc.loadPackage ('ti.drv.SPI');
    spi.Settings.socType = socType;

    /*加载 I2C 封装*/
    VAR socType ="AM335x";
    VAR I2C = xdc.loadPackage ('ti.drv.i2c');
    I2C.Settings.socType = socType;

    /*加载电路板封装*/
    VAR 板= XDC.loadPackage ('ti.board');
    board.Settings.boardName ="bbbAM335x";

    /*加载 UART 软件包*/
    VAR socType ="AM335x";
    VAR UART = xdc.loadPackage ('ti.drv.uart');
    UART.Settings.socType = socType;

    /*加载 EMAC 软件包*/
    VAR EMAC = XDC.loadPackage ('ti.drv.emac');
    emac.Settings.socType = socType;

    /*加载 NIMU 封装*/
    VAR Nimu= XDC.loadPackage ('ti.transport.NDK.Nimu');
    Nimu.Settings.socType = socType;

    /*========================= 高速缓存和 MMU 配置=================== *

    VAR Cache = xdc.useModule('ti.sysbios.family.arm.a8.Cache');
    cache.enableCache = false;

    VAR MMU = xdc.useModule('ti.sysbios.family.arm.a8.Mmu');
    MM4.enableMMU = true;

    /*强制外设部分为不可高速缓存的严格排序存储器*/
    VAR 外设 Attrs ={
    键入:MMU.FirstLevelDesc_section,//段描述符
    TEX:0、
    可缓冲:false, //可缓冲
    可高速缓冲:false, //可缓存
    可共享:false, //可共享
    NoExecute:true, //不可执行
    };

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x44e00400;;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x481a6000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);
    var hwi0Params = new hwi.Params();
    hwi0Params.instance.name ="gpio1int";
    program.global.gpio1int = Hwi.create (98、"&gpio1intFunction、hwi0Params);
    var semaphore0Params = new semaphore.Params ();
    semaphore0Params.instance.name ="BMI160Sem";
    Semaphore0Params.mode = Semaphore.Mode_binary;
    program.global.BMI160Sem = Semaphore.create (0、Semaphore0Params);
    VAR task0Params = new Task.Params();
    task0Params.instance.name ="bmi160task";
    task0Params.priority = 9;
    task0Params.STACKSIZE = 4000000;
    program.global.bmi160task = Task.create ("&readBMI160"、task0Params);
    task.idleTaskStackSize = 4000000;
    Task.defaultStackSize = 4000000;
    var clock0Params = new Clock.Params();
    clock0Params.instance.name ="clock1000ms";
    clock0Params.period = 1000;
    clock0Params.startFlag = true;
    program.global.clock1000ms = Clock.create ("&clock1hz"、1000、clock0Params);
    var semaphore1Params = new semaphore.Params ();
    semaphore1Params.instance.name ="ONEHzsem";
    Semaphore1Params.mode = Semaphore.Mode_Counting;
    program.global.oneHzsem = Semaphore.create (null、Semaphore1Params);
    VAR task1Params = new Task.Params();
    task1Params.instance.name ="onehztask";
    task1Params.priority = 3;
    task1Params.STACKSIZE = 4000000;
    program.global.onehztask = Task.create ("&oneHzTask"、task1Params);
    Defaults.common$.diags_INTERNAL = Diags.always_on;
    VAR task2Params = new Task.Params();
    task2Params.instance.name ="fuhztask";
    task2Params.priority = 5;
    task2Params.STACKSIZE = 4000000;
    task2Params.stack =空;
    program.global.fuhztask = Task.create ("&fUHzTask"、task2Params);
    var semaphore2Params = new semaphore.Params ();
    semaphore2Params.instance.name ="f百分比 HSem";
    Semaphore2Params.mode = Semaphore.Mode_Counting;
    program.global.aphzsem = semaphore.create (null、semaphore2Params);
    var clock1Params = new Clock.Params();
    clock1Params.instance.name ="clock10ms";
    clock1Params.period = 10;
    clock1Params.startFlag = true;
    program.global.clock10ms = Clock.create ("&clock100hz"、10、clock1Params);
    BIOS.heapTrackEnabled = true;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Alex、

    >>我实际上已经将我的所有网络代码从程序中取出,程序仍然崩溃。
    崩溃日志(堆栈跟踪、寄存器转储)看起来是什么样子?

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请访问 go.e2e.ti.com/.../register-dump.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不确定如何为您获取堆栈跟踪。 此外,我不确定我的寄存器转储是否起作用,因为我有很多“无法保存寄存器... ”我做了转储。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Alex、

    您可以尝试按照以下步骤(processors.wiki.ti.com/.../BIOS_FAQs )来调试崩溃问题。

    >>我实际上已经将我的所有网络代码从程序中取出,程序仍然崩溃
    另一个选项可能只是通过使用 SPI 程序逐步添加用于联网的代码、以缩小原因范围。

    此致、
    Garrett
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是我的 MMU 映射问题。 我将工作中的 NDK 示例.cfg 文件中的 MMU 内容复制到了工程中、一切都很棒!

    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x40300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x44e00000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x48000000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x48100000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x48200000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x48300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x49000000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x4a100000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);


    /*定义外设所在的1Meg 页的基址。 *
    VAR 外设 BaseAddr = 0x4a300000;

    /*相应地配置相应的 MMU 页描述符*/
    Mmu.setFirstLevelDescMeta(peripheralBaseAddr、
    peripheralBaseAddr、
    peripheralAttrs);