当前位置:首页 >> 信息与通信 >>

T-Kernel对应新硬件的实施指南




T-Kernel对应新硬件的实施指南
T-Kernel implementation guide to new hardware

Rev.1.00

2010.09

前言
? 本书是以将T-Kernel移植到新硬件为目的的实施指南。 ? T-Kernel以及T-Moni

tor等软件的规格请参阅各规格书。另外,T-Engine与CPU等硬件的规格书请参阅各自 相应的规格书。并且建议预先下载T-Kernel源代码。

使用注意事项
? SuperHTM是Renesas Electronics Corp.的商标。 ? 所有其他品牌名称与产品名称均为其各自所有者的注册商标或商标。 ? TRON、BTRON、ITRON、eTRON、T-Engine、μT-Engine、T-Monitor、T-Kernel是与计算机规格相对 应的名称,并不表示特定的产品。

修订履历 Rev. 1.00 发行日 页码 10/09/08 - 初版发行

T-Kernel 对应新硬件的实施指南 修订内容 要点

目录
1 前言 ............................................................................................................................................................1 1.1 2 前提条件 .........................................................................................................................................1

T-Kernel 实施规格的探讨 .......................................................................................................................2 2.1 2.2 2.3 2.4 2.5 2.6 2.7 CPU(实施规格第 1 章)..............................................................................................................2 内存(实施规格第 2 章) .............................................................................................................2 中断与异常(实施规格第 3 章) .................................................................................................3 初始化与启动处理(实施规格第 4 章)......................................................................................3 T-Kernel 的实施定义(实施规格第 5 章)..................................................................................3 系统构成信息(实施规格第 6 章)..............................................................................................5 T-Kernel 使用的资源(实施规格第 7 章)..................................................................................5

3

T-Kernel 源代码树的构建 .......................................................................................................................6 3.1 3.2 系统名称 .........................................................................................................................................6 T-Kernel 源代码详细说明..............................................................................................................6 3.2.1 3.2.2 3.2.3 3.2.4 3.2.5 3.3 3.3.1 3.3.2 3.3.3 “etc”目录 .........................................................................................................................7 “include”目录..................................................................................................................8 “config”目录 .................................................................................................................17 “lib”目录 .......................................................................................................................20 “kernel”目录..................................................................................................................31 硬件初始化及系统启动处理 .......................................................................................69 异常及中断入口处理 ...................................................................................................69 监控服务函数的实施 ...................................................................................................69

T-Monitor 的实施 .........................................................................................................................69

4

运行验证与适应化及最优化 ..................................................................................................................70 4.1 4.2 运行检查 .......................................................................................................................................70 适应化及最优化 ...........................................................................................................................70

5

参考文献及 URL.....................................................................................................................................70

1 前言
实时操作系统 T-Kernel 的源代码已在 T-Engine Forum 开放,它在嵌入式系统中的应用也逐渐增多。本文 档总结了在新硬件中实施 T-Kernel 时必须探讨的事项以及实施要点等,目的是使那些对 RTOS 并不熟悉 的工程师也能够比较容易地将 T-Kernel 移植到新系统中。

1.1

前提条件

将已开放的 T-Kernel 源代码实施到新系统时,有一些需要事先探讨的事项。 “如何选择编译器以及开发环境?” 对于已开放的 T-Kernel,推荐将 GCC 以及 Linux/Cygwin 环境作为标准开发环境,构建方法也采用 Makefile。在实施过程中,需要探讨编译器是使用 GCC,还是使用供应商提供的原厂正品编译器, 构建环境是以 Makefile 的形式进行,还是使用集成开发环境(例如 Renesas 的高性能嵌入式工作区 或者 Eclipse 等)。 “移植内容该怎么办?” 在实施过程中,需要探讨是要进行 T-Kernel 功能的最优化(适应化),还是仅更改硬件相关的部 分做“单纯移植”。 “模块构成该怎么办?” 目前已经开放的实施部分,T-Kernel 与 T-Monitor 是分开实施的,并且 T-Monitor 仅开放了其规 格,源代码并未在 T-Engine Forum 开放(而在 SH/M32R T-Engine HomePage 中已开放了用于 SH/M32R 的 T-Monitor 参考示例源代码) 。因此在将 T-Kernel 实施到新系统时, 需要探讨 T-Monitor 该如何处理。需要探讨是将 T-Kernel、T-Monitor 分开实施,还是将 T-Monitor 的功能(部分)整 合到 T-Kernel 中进行实施。 “硬件构成有没有问题?” 对于移植对象的硬件,虽然不需要基于 T-Engine 的规格,但原则上要求是 32 位的微机,并带有 ROM(闪存)、RAM。另外为了输出表示 T-Kernel 运行状态的信息,最好带有串行输入输出。 本文档 ? T-Kernel 为单纯移植 ? 构建环境为 Cygwin 环境,编译器使用 GCC,构建采用 Makefile 在以后进行说明。

(1/70)

2 T-Kernel 实施规格的探讨
在已公开的 T-Kernel 中,每一支持的 T-Engine 都有实施规格书,分别描述了与实施相关的内容。在新系 统中实施 T-Kernel,并且根据需要将其作为单纯移植补丁发布时,除了单纯对源代码做出更改、修正之 外,预先编写实施规格书则可以更有效率地进行实施(移植),因此首先针对 T-Kernel 实施规格每一章 的描述内容,探讨其实施内容。

2.1

CPU(实施规格第 1 章)

在 T-Kernel 中,规定有 0~3 级的内存保护级别,使用微机功能(特权模式、用户模式等)实施保护级别 时,需要探讨如何使其对应实施。而搭载有 MMU 时也需要建立与保护级别的对应关系。(参阅 T-Kernel 规格书 2.7.3“保护级别”)

2.2

内存(实施规格第 2 章)

内存映射表示在 T-Kernel 及应用程序软件上是怎样使用 RAM,ROM 以及微机的内置存储器的。原则上 针对表 2.1 所示的软件模块配置进行探讨,最好能以图示分别描述每个 RAM,ROM 的内存映射与整体 内存映射。 表 2.1 内存映射中软件及功能块的定义项目列表 软件及功能块 T-Monitor T-Kernel ROM 信息 系统共享信息 T-Kernel 管理区域 用户区域 矢量地址 其他内存 注意事项及备注 原则上在打开电源后最先运行。硬件初始化后,根据 ROM 信息的内容转 向 T-Kernel 的入口地址 T-Kernel 主体 在 RomInfo 结构体中定义的配置信息 在 SysCommonInfo 结构体中定义 T-Kernel 的管理区域,从该区域确保内存的动态分配 配置用户应用程序的区域(在 T-Kernel 中本地址无关) 产生中断时的入口处理所在区域 当存在共享内存或缓存对象区域等时要注意配置

作为 ROM 搭载闪存时,需要注意各软件模块的配置地址不要在闪存的同一个扇区内重叠配置。 另外,当可以通过微机功能更改矢量地址时(例如,M32R 的 EVB 寄存器,SH 的 VBR 寄存器),最好 将矢量地址配置在可高速访问的内存中。 而对于用户堆栈、系统堆栈以及异常/中断堆栈这 3 种堆栈,要探讨它们的区别使用和堆栈指针的设置等 问题。在支持特权模式系统的 T-Kernel 中,用户堆栈和系统堆栈是区别使用的。

(2/70)

2.3

中断与异常(实施规格第 3 章)
表 2.2 “中断/异常”的定义项目列表 项目 注意事项及备注 与中断、异常相对应的唯一的编号(与微机的矢量编号不同) 注册与中断定义编号相对应的处理函数的地址表。 由于其被动态设置及清除,因此配置在 RAM 中 通过系统调用或服务调用等方式使用软件中断(TRAPA、TRAP、 SYSCALL 等)时的编号分配 定义产生异常/中断时的入口处理(备份的寄存器、堆栈内容、中断级 别)。在已开放的实施规格书中提示有示例代码。

在 T-Kernel 中的中断/异常处理中,规定如表 2.2 所示的中断定义编号与矢量表地址。

中断定义编号(dintno) 中断矢量表 软件中断编号的分配 异常/中断的入口处理 (T-Monitor)

目前开放的 T-Kernel 中的异常/中断处理根据系统的不同而存在差异,其处理流程如下。 [1] [2] [3] 由硬件进行的中断接收处理 异常/中断入口处理(进行最低限度的堆栈备份、中断定义编号定义等) 转向异常/中断矢量表中所记载的中断处理程序(入口)地址

(TA_HLNG 属性时为 inthdr_startup,TA_ASM 属性时为用户定义处理程序)

2.4

初始化与启动处理(实施规格第 4 章)

定义从 T-Engine 系统复位到 T-Kernel 启动的步骤,T-Monitor 及 T-Kernel 共享数据结构体与 T-Kernel 启 动环境。 表 2.3 “初始化与启动处理”中的定义项目列表 项目 T-Kernel 启动步骤 ROM 信息(RomInfo 结构体) 系统共享信息(SysCommonInfo) T-Kernel 启动环境 注意事项及备注 从 T-Engine 系统复位到 T-Kernel 启动的步骤 在 include/sys/sysdepend/<TARGET>/rominfo_depend.h 中定义 T-Monitor,T-Kernel 共享的系统信息。T-Monitor 也进行定义 T-Kernel 启动时的硬件设置,预先定义的中断处理程序编号等信息

2.5
(1)

T-Kernel 的实施定义(实施规格第 5 章)
系统状态的判断
定义任务无关部分的判断方法。(源代码中利用 isTaskIndependent 宏定义)。 准任务部分的判断是在内核基本部分中由软件判断,单纯移植时原则上不需要任何处理。(参阅 T-Kernel 规格书 2.5.2“任务无关部分与准任务部分”)

(2)

T-Kernel 中使用的异常/中断
规定系统调用等使用的异常(软件中断)与系统定时器使用的定时功能。在已开放的 T-Kernel 源代码 中,虽然因系统不同而存在差异,但原则上使用软件中断实施以下的功能。 ? T-Kernel 系统调用及扩展 SVC ? tk_ret_int 系统调用 ? 任务调度程序调用 ? T-Kernel/DS 系统调用(Debugger Support 功能)

(3/70)

(3)

系统调用/扩展 SVC 的接口
系统调用的接口在接口程序库(libsvc)中定义。在已开放的源代码中使用软件中断功能(TRAPA、 TRAP、SYSCALL 等)实施。定义内容为功能代码的分配、软件中断编号、寄存器的保存规则。在已 开放的源代码中,通过使用 Perl 脚本,接口程序库源文件能够自动生成,因此如有必要,在新系统中 实施时也需要准备 Perl 脚本。

(4)

中断处理程序
中断处理程序的定义内容如表 2.4 所示。 表 2.4 “中断处理程序”中的定义项目列表 项目 注意事项及备注 在 tk_def_int 系统调用中使用的中断处理程序定义结构体 处理程序函数 API 的规定等 堆栈指针的设置、中断处理结束时的返回方法等

T_DINT 结构体 TA_HLNG 属性的中断处理程序 TA_ASM 属性的中断处理程序

(5)

时间事件处理程序
对于时间事件处理程序(系统时钟用中断处理程序)的定义,如存在 TA_ASM 属性的定义内容或其 他特殊事项等则进行探讨并定义。

(6)

任务
任务的定义内容如表所示。 表 2.5 “任务”中的定义项目列表 项目 注意事项及备注 在 tk_cre_tsk 系统调用中使用的任务生成信息结构体 在任务属性中指定了保护级别时的实施内容 在任务属性中指定了任务固有空间 TA_TASKSPACE 时的实施内容 调用任务时的 API 与寄存器设置 任务通用寄存器定义(在 tk_get_reg/tk_set_reg 中使用) 异常时被保存的寄存器定义 控制寄存器定义 当存在协处理器或在 T-Kernel 中使用时定义 T_COPnREGS

T_CTSK 结构体 任务保护级别 任务固有空间 任务的 API T_REGS 结构体 T_EIT 结构体 T_CREGS 结构体 协处理器寄存器结构体

(7)

任务异常处理程序
定义任务异常处理程序被调用时的堆栈及寄存器状态与任务异常处理程序的入口程序描述示例(准备 TEXHDR_ENTRY 宏)。

(8)

系统调用/扩展 SVC 处理程序挂钩程序
系统调用/扩展 SVC 挂钩程序功能是在 T-Kernel/DS 下使用的功能,定义挂钩程序定义信息 TD_CALINF 结构体与挂钩程序调用时的堆栈状态。

(4/70)

(9)

系统内存管理与地址空间管理
系统内存管理以及地址空间管理中的定义内容如表 2.6 所示。 表 2.6 “系统内存管理及地址空间管理”中的定义项目列表 项目
注意事项及备注 可在 tk_get_smb 系统调用中指定的属性 外部 RAM 或内部 RAM 在 tk_ref_smb 中获得块数的说明 进行了地址空间设置时的实施规格 CnvPhysicalAddr 函数的实施内容定义 可用 MapMemory 函数指定的属性

系统内存分配 系统内存信息 地址空间的操作 获得物理地址 内存的映射

2.6

系统构成信息(实施规格第 6 章)

定义 SYSCONF、DEVCONF 中的设置内容作为系统构成信息。

2.7

T-Kernel 使用的资源(实施规格第 7 章)

在 T-Kernel 使用的资源中,定义内核对象与子系统。对 T-Kernel 进行单纯移植时与第 7 章所记载的内容 没有大的变化。

(5/70)

3 T-Kernel 源代码树的构建
说明在实施 T-Kernel 时,以目录、源代码单位实施的内容。

3.1

系统名称

在 T-Kernel 中针对对象硬件定义 TETYPE 与 MACHINE 两个符号加以区别。 TETYPE:mic (uT-Engine),std (T-Engine),app (T-Engine Appliance) MACHINE:目标系统的 CPU 名称 设置与目标相关的目录为 TETYPE_MACHINE (例如 mic_m32104,std_sh7727) ,或仅为 MACHINE (例 如 sh7145)。 以下目录的描述中包含系统名称时,描述为<TARGET>或<MACHINE>。 例如:etc/sysdepend/<TARGET> ( etc/sysdepend/mic_sh7145 )

3.2

T-Kernel 源代码详细说明

按照源代码的每一个目录对 T-Kernel 的实施进行说明。 目录描述中的<TARGET>表示 TETYPE_MACHINE(例如,mic_m32104,std_sh7760),<MACHINE> 表示 CPU 名称(例如 sh7751r)。 另外在源代码的描述中,存在 GCC 固有的语言描述(例如:Inline 或 ASM 函数),因此使用 GCC 之外 的编译器时,也需要注意这些描述。

(6/70)

3.2.1 “etc”目录
说明 etc 目录的系统相关文件的实施内容。 表 3.1 etc 目录的系统相关文件 目录名 文件名 设置及更改内容 构建设置、工具及选项指定

etc/sysdepend/<TARGET> makerules.sysdepend

(1)

sysdepend/<TARGET>/makerules.sysdepend

_TE_SYSTEM_NAME
[类别] 符号定义 [定义内容] 设置 TARGET 类型。描述 TETYPE 与 MACHINE 名称。 [定义范例] _TE_SYSTEM_NAME_ = _MIC_SH7145_

工具名称定义(CC,CXX,AS,AR,RANLIB,NM,CPP,STRIP,OBJCOPY)
[类别] 符号定义 [定义内容] 设置工具名称。 [定义范例] CC := $(GNUsh)/bin/sh-elf-gcc CXX := $(GNUsh)/bin/sh-elf-gcc AS = $(GNUsh)/bin/sh-elf-as LD = $(GNUsh)/bin/sh-elf-ld AR = $(GNUsh)/bin/sh-elf-ar RANLIB = $(GNUsh)/bin/sh-elf-ranlib NM = $(GNUsh)/bin/sh-elf-nm CPP = $(GNU_BD)/bin/sh-elf-cpp STRIP = $(GNUsh)/bin/sh-elf-strip --strip-unneeded OBJCOPY = $(GNU_BD)/bin/sh-elf-objcopy

工具选项定义(CFLAGS, CPPFLAGS,)
[类别] 符号定义 [定义内容] 设置 GCC 编译选项等工具的选项。 [定义范例] CFLAGS += -O2

(7/70)

3.2.2 “include”目录
Include 目录的系统相关文件的一览列表如表 3.2 所示。 表 3.2 include 目录的系统相关文件 目录名 sys/sysdepend 文件名 machine_common.h rominfo_common.h segment_common.h str_align_common.h sysexc_common.h sysinfo_common.h sys/sysdepend/<TARGET> machine_depend.h rominfo_depend.h segment_depend.h str_align_depend.h sysexc_depend.h sysinfo_depend.h tk/sysdepend asm_common.h dbgspt_common.h syscall_common.h sysdef_common.h syslib_common.h tk/sysdepend/<TARGET> asm_depend.h cpuattr.h cpudef.h dbgspt_depend.h sysdef_depend.h syslib_depend.h 设置及更改内容 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 CPU 类型等定义 ROMINFO 定义 内存属性定义 字符串的对齐设置 系统异常结构体定义 系统管理信息、更改矢量入口 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 <TARGET>用 Include 文件追加 更改汇编宏 中断/异常用汇编宏定义 CPU 属性符号定义 TD_CALINF 结构体定义 周边 I/O 地址定义 矢量编号、程序库函数定义

(1)

sys/sysdepend/*_common.h

Include 文件定义追加
[类别] Include 文件定义 [定义内容] 定义(追加)<TARGET>相关的 Include 文件。 [定义范例] #ifdef _MIC_SH7145_ #include <sys/sysdepend/mic_sh7145/machine_depend.h> #endif [备注] 对象文件为下列的 6 个文件。 machine_common.h,rominfo_common.h,segment_common.h,str_align_common.h, sysexc_common.h,sysinfo_common.h

(8/70)

(2)

sys/sysdepend/<TARGET>/machine_depend.h

系统符号定义
[类别] 符号定义 [定义内容] 定义与<TARGET>相对应的各类符号。这些设置用于编译时的判断。 CPU_xxxx ALLOW_MISALIGN BIGENDIAN VIRTUAL_ADDRESS ALLOCA_NOSPT _Csym CPU 类型设置 1 if access to misalignment data is allowed 1 if big endian 1 if virtual memory 1 if alloca() is not supported 是否于函数名称加 underscore?1 加、0 不加 (参阅 include/machine.h) [定义范例] /* ----- T-Engine/SH7145(SH-2) definition ----- */ #undef _MIC_SH7145_ #define _MIC_SH7145_ #define CPU_SH2 #define CPU_SH7145 #define MIC_SH7145 #define ALLOW_MISALIGN #define BIGENDIAN #define ALLOCA_NOSPT #ifndef _Csym #define _Csym #endif [备注] Csym 设置为1时,kernel/sysmain/build/[TARGET]/kernel-rom.lnk ,kernel-ram.lnk 的__data_org 或 __bss_start 等符号如不增加一个 underscore 将无法正常构建。 另外,在已开放的 T-Kernel(已开放补丁的除外)中 Csym 被定义为 0。 (标准开发包附带的 GCC 中默认设置为不输出 underscore) 1 1 0 0 #define VIRTUAL_ADDRESS 1 1 1 0 1

(3)

sys/sysdepend/<TARGET>/rominfo_depend.h

RomInfo 结构体定义
[类别] ROM 信息结构体的类型定义 [定义内容] 定义 RomInfo 结构体。描述创建实施规格书第 4 章时所规定的结构体的内容。

(9/70)

ROM 信息地址定义
[类别] 符号定义 [定义内容] 定义配置 ROM 信息(RomInfo 结构体)的首地址。预先设置实施规格书第 2 章中规定的地址。 [定义范例] /* Start address of ROMInfo */ #define ROMInfo ( (RomInfo*)0x00000C00 ) [备注] 地址与 config/build/<TARGET>/rominfo.lnk 进行匹配。

(4)

sys/sysdepend/<TARGET>/segment_depend.h

内存属性定义
[类别] 符号定义 [定义内容] 定义表示内存属性的符号。按照实施规格书第 5.9 章“内存的映射”中的描述进行设置。本符号在 MapMemory()函数中指定。 [定义范例] #define MM_USER #define MM_SYSTEM #define MM_READ 0x08U 0x00U 0x01U /* User */ /* System */ /* Read */

(5)

sys/sysdepend/<TARGET>/str_align_depend.h

位对齐定义
[类别] 宏定义 [定义内容] 定义位对齐用宏 pad_b, pad_l。由于不同的字节序与位宽(32 位或 64 位)其实施会存在差异,因此要 注意。

(6)

sys/sysdepend/<TARGET>/sysexc_depend.h

系统异常结构体定义
[类别] 结构体定义 [定义内容] 定义 EXCMESG 结构体。本定义在 T-Kernel/Standard Extension 中使用,因此如无必要可不定义。

(10/70)

(7)

sys/sysdepend/<TARGET>/sysinfo_depend.h

系统共享信息定义
[类别] 结构体、符号定义 [定义内容] 定义 SysCommonInfo 结构体。如 SysCommonInfo 结构体存在随带结构体(例如 BootMode, SysCommonArea 等)也需要定义。描述实施规格书第 4.2 章“系统共享信息”中规定的内容。 [定义范例] /* * System common information */ typedef struct { VP VP VP VP UH UH UB UB UW UB VW iramtop; iramend; ramtop; ramend; Sclk; Pclk; *sysconf; *devconf; loop64us; bm; /* Internal RAM free space top */ /* Internal RAM free space end */ /* RAM free space top */ /* RAM free space end */ /* system clock (MHz) */ /* peripheral clock (MHz) */ /* SYSCONF top */ /* DEVCONF top */ /* Loop count per 64 micro sec */ /* Boot mode */

BootMode

bootdev[8]; /* Boot device name */ rsv[5]; /* Reserved (always 0) */

} SysCommonInfo;

(8)

tk/sysdepend/*_common.h

Include 文件定义追加
[类别] Include 文件定义追加 [定义内容] 定义<TARGET>相关的 Include 文件。 [定义范例] #if MIC_SH7145 #include <tk/sysdepend/mic_sh7145/asm_depend.h> #endif [备注] 对象文件为下列的 5 个文件。 asm_common.h,dbgspt_common.h,syscall_common.h,sysdef_common.h,syslib_common.h

(11/70)

(9)

tk/sysdepend/<TARGET>/asm_depend.h

中断及异常处理用汇编宏定义
[类别] 汇编宏定义 [定义内容] 定义发生异常或中断时、处理结束时的汇编宏。宏名可以以任意的名称定义,定义的宏在 kernel/sysdepend/cpu/<MACHINE>/cpu_support.S 中被使用。 [定义范例] /* * Exception/Interrupt entry common processing */ .macro INT_ENTER name /* push registers to stack */ /* Interrupt disable state */ .endm /* * Exception/trap return */ .macro EXC_RETURN name /* pop registers from stack */ rte .endm /* return from exception */

任务异常处理程序的汇编宏定义
[类别] 汇编宏定义 [定义内容] 在宏 TEXHDR_ENTRY 中定义发生任务异常时的入口。 [定义范例] /* * Task exception handler entry */ .macro TEXHDR_ENTRY texhdr /* Register save to stack */ /* set “texcd” to argument register */ /* call texhdr(texcd) */ /* Restore registers from stack */ rte /* return from task exception */ .endm

(12/70)

(10) tk/sysdepend/<TARGET>/cpuattr.h CPU 属性符号定义
[类别] 符号定义 [定义内容] 定义与 TARGET 相对应的各类符号。这些设置用于编译时的判断。 TA_GP TA_FPU [定义范例] /* * Global pointer support * */ #define TA_GP /* * Using FPU (depend on CPU) * * */ #define TA_FPU 0 0: not using FPU TA_COPn(n = 0-3): using FPU 0 /* No global pointer support */ 0: No global pointer support 是否使用 Global pointer 是否使用 FPU

(11) tk/sysdepend/<TARGET>/cpudef.h 任务寄存器结构体定义
[类别] 结构体的类型定义 [定义内容] 定义 T_REGS, T_EIT, T_CREGS, T_COPREGS 结构体。 在 tk_get_reg,tk_set_reg,td_get_reg,td_set_reg 以及 tk_get_cpr,tk_set_cpr 中被使用。 [定义范例] /* * General purpose register */ typedef struct t_regs { VW r[15]; /* General purpose register R0-R14 */ } T_REGS; /* * Exception-related register */ typedef struct t_eit { VP pc; /* Program counter */ } T_EIT; tk_get_reg tk_set_reg tk_get_reg tk_set_reg

(13/70)

(12) tk/sysdepend/<TARGET>/dbgspt_depend.h TD_CALINF 结构体定义
[类别] 结构体的类型定义 [定义内容] 定义 TD_CALINF 结构体的类型。TD_CALINF 结构体被用作系统调用及扩展 SVC 挂钩程序的 enter 函数的参数。描述实施规格书第 5.8 章“系统调用/扩展 SVC 挂钩程序”中规定的内容。 在 kernel/sysdepend/cpu/<MACHINE>/cpu_support.S 中使用。 [定义范例] /* * System call/extension SVC caller information */ typedef struct td_calinf { /* System stack pointer */ /* PR register when calling */ /* Frame pointer when calling */ } TD_CALINF;

(13) tk/sysdepend/<TARGET>/sysdef_depend.h CPU 相关地址定义
[类别] 符号定义 [定义内容] 进行与<TARGET>相对应的寄存器地址、中断定义编号等尤其与微机(CPU)相关的定义。 [定义范例] /* * Trap number for T-Kernel */ #define TRAP_SVC 34 /* System call, Extension SVC */

(14/70)

(14) tk/sysdepend/<TARGET>/syslib_depend.h 矢量编号定义
[类别] 符号定义 [定义内容] 定义矢量编号。 [定义范例] /* * Interrupt vector value (part) */ typedef enum intvec { IV_NMI IV_SCI } IntVec; = 6, = 7,

. . . . . . .

CPU 中断控制宏定义
[类别] 宏定义 [定义内容] 定义 CPU 中断控制宏。定义如下的宏。 ? DI(UINT intsts) ? EI(UINT intsts) ? isDI(UINT intsts) [定义范例] #define DI(intsts) ( (intsts) = disint() ) #define EI(intsts) ( enaint(intsts) ) #define isDI(intsts) ( ((intsts) & 0x0040U) != 0 )

中断控制器控制宏及函数定义
[类别] 宏及函数定义 [定义内容] 定义中断控制器控制宏及函数。进行如下的函数定义或类型定义。 ? UINT DINTNO(INTVEC intvec) ? void EnableInt(INTVEC intvec)或 void EnableInt(INTVEC intvec, INT level) ? void DisableInt(INTVEC intvec) ? void ClearInt(INTVEC intvec) ? void EndOfInt(INTVEC intvec) ? BOOL CheckInt(INTVEC intvec) 上述函数为类型定义时,函数体被定义在 lib/libtk/src/<TARGET>/int.c 中。

(15/70)

I/O 端口访问(内联)函数定义
[类别] 函数定义 [定义内容] 定义 I/O 端口访问(内联)函数。定义如下的函数。 ? void out_w(INT port, UW data) ? void out_h(INT port, UH data) ? void out_b(INT port, UB data) ? UW out_w(INT port) ? UH out_h(INT port) ? UB out_b(INT port) [定义范例] Inline UB in_b( INT port ) { UB data; Asm("mov.b @%1, %0": "=r"(data): "r"(port)); return data; } [备注] 在已开放的源代码中,通过 Asm 函数实施。

(16/70)

3.2.3 “config”目录
表 3.3 config 目录的系统相关文件一览列表 目录名 src/sysdepend/<TARGET> 文件名 DEVCONF SYSCONF rominfo.c rominfo_conf.h build/<TARGET> devconf.c sysconf.c rominfo.lnk Makefile 设备配置信息定义 系统配置信息定义 ROM 信息定义 ROM 信息符号定义 设备配置信息 系统配置信息 Rom 信息链接脚本 构建用文件 内容

(1)

src/sysdepend/<TARGET>/DEVCONF

设备配置信息定义
[类别] 符号定义 [定义内容] 定义与 TARGET 相对应的各类设备配置符号。在开放源代码中仅进行了 DEBUGMODE 的设置,本设 置值被用作 SysCommonInfo 的 bm(BootMode)设置用数据。 [定义范例] # Debug mode (1:debug mode, 0:normal mode) DEBUGMODE [备注] 本文件在 Make 时被 Perl 脚本调用并用于生成 devconf.c。 而当无法使用 PERL 时要更改 devconf.c 的设 置值。 1

(2)

src/sysdepend/<TARGET>/SYSCONF

系统共享信息定义
[类别] 符号(设置值)定义 [定义内容] 定义<TARGET>相关的各类系统配置符号。单纯移植时直接以符号名更改设置值(TMAX*以及 RealMemEnd)。 在开放源代码中这些系统配置设置值在 kernel/tkernel/src 目录内的内核对象初始化时被参阅。 [定义范例] # [备注] 本文件在 Make 时被 Perl 脚本调用并用于生成 sysconf.c。而当无法使用 PERL 时要更改 sysconf.c 的设 置值。 Segment manager RealMemEnd 0x05000000 # RAM bottom address (logical address)

(17/70)

(3)

src/sysdepend/<TARGET>/rominfo.c

ROM 信息定义
[类别] 数据定义 [定义内容] 定义<TARGET>相关的 ROM 信息结构体。以符号方式进行数据定义,立即值的定义在 rominfo_conf.h 中进行。 [定义范例] RomInfo rominfo = { RI_INTSTACK, RI_KERNEL_START, RI_SYSCONF, RI_DEVCONF, RI_USERINIT, RI_RESETINIT, {0} }; /* Interrupt stack size */ /* Kernel startup address */ /* SYSCONF top */ /* DEVCONF top */ /* RAM user area top */ /* User initialization program address */ /* Reset initialization program address */

RI_USERAREA_TOP,

/* Reserved (always 0) */

(4)

src/sysdepend/<TARGET>/rominfo_conf.h

ROM 信息符号定义
[类别] 符号定义 [定义内容] 定义 rominfo.c 中设置的 ROM 信息符号。 [定义范例] #define RI_KERNEL_START (FP)0x00050000 /* Kernel start address */

(5) build/<TARGET>/devconf.c 设备配置信息定义
[类别] 符号定义 [定义内容] 从 DEVCONF 自动生成的 C 语言源文件。如存在更改设置值的情况,则在 DEVCONF 文件进行更改 而不更改本文件。(无法使用 PERL 时更改本文件) [定义范例] #include <basic.h> EXPORT UB DEVCONF [] = { "DEBUGMODE 1\n" };

(18/70)

(6)

build/<TARGET>/sysconf.c

CPU 属性定义
[类别] 符号定义 [定义内容] 从 DEVCONF 自动生成的 C 语言源文件。如存在更改设置值的情况,则在 DEVCONF 文件进行更改 而不更改本文件。(仅在无法使用 PERL 时更改本文件) [定义范例] #include <basic.h> EXPORT UB SYSCONF [] = { "TSysName T-Kernel\n"

(7)

build/<TARGET>/rominfo.lnk

ROM 信息链接脚本定义
[类别] 地址定义 [定义内容] 构建 ROM 信息时使用的链接脚本。GCC 以外的则另外需要通过定义有链接地址的文件等定义内存映 射。

(8)

build/<TARGET>/Makefile

CPU 属性定义
[类别] 构建用文件 [定义内容] 构建 ROM 信息时使用的 Makefile。仅更改 MACHINE 与 TETYPE 进行使用。

(19/70)

3.2.4 “lib”目录
表 3.4 lib 目录下的系统相关文件列表(1) 目录名 build/<TARGET> crt/crt0/build/<TARGET> crt/crttk/build/<TARGET> libstr/build/<MACHINE> libsvc/build/<MACHINE> libtk/build/<TARGET> libtm/build/<TARGET> 文件名 Makefile Makefile Makefile Makefile Makefile Makefile Makefile crtn.S crti.S crt1f.S crt1s.S crtir.S crt/crt0/src/sysdepend/<TARGET> asmstartup.S libsvc/build/<TARGET> makeifex.pl makeiftk.pl makeiftd.pl libsvc/src/sysdepend/<TARGET> changespace.S chkspace.S chkspacebstr.S chkspacelen.S chkspacetstr.S cnvphysicaladdr.S console_conf.S console_ctl.S console_get.S console_in.S console_out.S console_put.S lockspace.S makespace.S mapmemory.S readmemspace.S setmemspaceb.S td_acp_que.S td_cal_que.S td_flg_que.S td_get_otm.S td_get_reg.S 内容 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 MACHINE、TETYPE 类型更改 汇编程序启动文件 汇编程序启动文件 汇编程序启动文件 汇编程序启动文件 汇编程序启动文件 汇编程序启动文件 汇编程序启动文件 扩展 SVC 接口函数用 PERL 脚本 T-Kernel 系统调用用 PERL 脚本 T-Kernel/DS 系统调用用 PERL 脚本 程序库函数“Changespace”I/F 程序 程序库函数“ChkSpace”I/F 程序 程序库函数“ChkSpace”I/F 程序 程序库函数“ChkSpace”I/F 程序 程序库函数“ChkSpace”I/F 程序 程序库函数“CnvPhysicalAddr”I/F 扩展 SVC“Console_conf”I/F 扩展 SVC“Console_ctl”I/F 扩展 SVC“Console_get”I/F 扩展 SVC“Console_in”I/F 扩展 SVC“Console_out”I/F 扩展 SVC“Console_put”I/F 程序库函数“LockSpace”I/F 程序库函数“MakeSpace”I/F 程序库函数“MapMemory”I/F 程序库函数“ReadMemSpace”I/F 程序库函数“SetMemSpaceB”I/F T-Kernel/DS “td_acp_que” I/F T-Kernel/DS “td_cal_que” I/F T-Kernel/DS “td_flg_que” I/F T-Kernel/DS “td_get_otm” I/F T-Kernel/DS “td_get_reg” I/F

crt/crt0/src/sysdepend/<TARGET> crt0.S

(20/70)

表 3.5 lib 目录下的系统相关文件列表(2) 目录名 libsvc/src/sysdepend/<TARGET> 文件名 td_get_tim.S td_hok_dsp.S td_hok_int.S td_hok_svc.S td_inf_tsk.S td_lst_alm.S td_lst_cyc.S td_lst_flg.S td_lst_mbf.S td_lst_mbx.S td_lst_mpf.S td_lst_mpl.S td_lst_mtx.S td_lst_por.S td_lst_sem.S td_lst_ssy.S td_lst_tsk.S td_mbx_que.S td_mpf_que.S td_mpl_que.S td_mtx_que.S td_rdy_que.S td_ref_alm.S td_ref_cyc.S td_ref_dsname.S td_ref_flg.S td_ref_mbf.S td_ref_mbx.S td_ref_mpf.S td_ref_mpl.S td_ref_mtx.S td_ref_por.S td_ref_sem.S td_ref_ssy.S td_ref_sys.S td_ref_tex.S td_ref_tsk.S td_rmbf_que.S td_sem_que.S td_set_dsname.S 内容 T-Kernel/DS “td_get_tim” I/F T-Kernel/DS “td_hok_dsp” I/F T-Kernel/DS “td_hok_int” I/F T-Kernel/DS “td_hok_svc” I/F T-Kernel/DS “td_inf_tsk” I/F T-Kernel/DS “td_lst_alm” I/F T-Kernel/DS “td_lst_cyc” I/F T-Kernel/DS “td_lst_flg” I/F T-Kernel/DS “td_lst_mbf” I/F T-Kernel/DS “td_lst_mbx” I/F T-Kernel/DS “td_lst_mpf” I/F T-Kernel/DS “td_lst_mpl” I/F T-Kernel/DS “td_lst_mct” I/F T-Kernel/DS “td_lst_por” I/F T-Kernel/DS “td_lst_sem” I/F T-Kernel/DS “td_lst_ssy” I/F T-Kernel/DS “td_lst_tsk” I/F T-Kernel/DS “td_mbx_que” I/F T-Kernel/DS “td_mpf_que” I/F T-Kernel/DS “td_mpl_que” I/F T-Kernel/DS “td_mtx_que” I/F T-Kernel/DS “td_rdy_que” I/F T-Kernel/DS “td_ref_alm” I/F T-Kernel/DS “td_ref_cyc” I/F T-Kernel/DS “td_ref_dsname” I/F T-Kernel/DS “td_ref_flg” I/F T-Kernel/DS “td_ref_mbf” I/F T-Kernel/DS “td_ref_mbx” I/F T-Kernel/DS “td_ref_mpf” I/F T-Kernel/DS “td_ref_mpl” I/F T-Kernel/DS “td_ref_mtx” I/F T-Kernel/DS “td_ref_por” I/F T-Kernel/DS “td_ref_sem” I/F T-Kernel/DS “td_ref_ssy” I/F T-Kernel/DS “td_ref_sys” I/F T-Kernel/DS “td_ref_tex” I/F T-Kernel/DS “td_ref_tsk” I/F T-Kernel/DS “td_rmbf_que” I/F T-Kernel/DS “td_sem_que” I/F T-Kernel/DS “td_sem_dsname” I/F

(21/70)

表 3.6 lib 目录下的系统相关文件列表(3) 目录名 libsvc/src/sysdepend/<TARGET> 文件名 td_set_reg.S td_smbf_que.S tk_acp_por.S tk_cal_por.S tk_can_wup.S tk_chg_pri.S tk_chg_slt.S tk_cln_ssy.S tk_clr_flg.S tk_cls_dev.S tk_cre_alm.S tk_cre_cyc.S tk_cre_flg.S tk_cre_mbf.S tk_cre_mbx.S tk_cre_mpf.S tk_cre_mpl.S tk_cre_mtx.S tk_cre_por.S tk_cre_res.S tk_cre_sem.S tk_cre_tsk.S tk_def_dev.S tk_def_int.S tk_def_ssy.S tk_def_tex.S tk_del_alm.S tk_del_cyc.S tk_del_flg.S tk_del_mbf.S tk_del_mbx.S tk_del_mpf.S tk_del_mpl.S tk_del_mtx.S tk_del_por.S tk_del_res.S tk_del_sem.S tk_del_tsk.S tk_dis_dsp.S tk_dis_tex.S 内容 T-Kernel/DS “td_set_reg” I/F T-Kernel/DS “td_smbf_que” I/F T-Kernel/OS “tk_acp_por” I/F T-Kernel/OS “tk_cal_por” I/F T-Kernel/OS “tk_can_wup” I/F T-Kernel/OS “tk_chg_pri” I/F T-Kernel/OS “tk_chg_slt” I/F T-Kernel/OS “tk_cln_ssy” I/F T-Kernel/OS “tk_clr_flg” I/F T-Kernel/SM “tk_cls_dev” I/F T-Kernel/OS “tk_cre_alm” I/F T-Kernel/OS “tk_cre_cyc” I/F T-Kernel/OS “tk_cre_flg” I/F T-Kernel/OS “tk_cre_mbf” I/F T-Kernel/OS “tk_cre_mbx” I/F T-Kernel/OS “tk_cre_mpf” I/F T-Kernel/OS “tk_cre_mpl” I/F T-Kernel/OS “tk_cre_mtx” I/F T-Kernel/OS “tk_cre_por” I/F T-Kernel/OS “tk_cre_res” I/F T-Kernel/OS “tk_cre_sem” I/F T-Kernel/OS “tk_cre_tsk” I/F T-Kernel/SM “tk_def_dev” I/F T-Kernel/OS “tk_def_int” I/F T-Kernel/OS “tk_def_ssy” I/F T-Kernel/OS “tk_def_tex” I/F T-Kernel/OS “tk_del_alm” I/F T-Kernel/OS “tk_del_cyc” I/F T-Kernel/OS “tk_del_flg” I/F T-Kernel/OS “tk_del_mbf” I/F T-Kernel/OS “tk_del_mbx” I/F T-Kernel/OS “tk_del_mpf” I/F T-Kernel/OS “tk_del_mpl” I/F T-Kernel/OS “tk_del_mtx” I/F T-Kernel/OS “tk_del_por” I/F T-Kernel/OS “tk_del_re” I/F T-Kernel/OS “tk_del_sem” I/F T-Kernel/OS “tk_del_tsk” I/F T-Kernel/OS “tk_dis_dsp” I/F T-Kernel/OS “tk_dis_tex” I/F

(22/70)

表 3.7 lib 目录下的系统相关文件列表(4) 目录名 libsvc/src/sysdepend/<TARGET> 文件名 tk_dis_wai.S tk_dly_tsk.S tk_ena_dsp.S tk_ena_tex.S tk_ena_wai.S tk_end_tex.S tk_evt_dev.S tk_evt_ssy.S tk_exd_tsk.S tk_ext_tsk.S tk_frsm_tsk.S tk_fwd_por.S tk_get_cfn.S tk_get_cfs.S tk_get_cpr.S tk_get_dev.S tk_get_mpf.S tk_get_mpl.S tk_get_otm.S tk_get_reg.S tk_get_res.S tk_get_rid.S tk_get_smb.S tk_get_tid.S tk_get_tim.S tk_get_tsp.S tk_inf_tsk.S tk_loc_mtx.S tk_lst_dev.S tk_opn_dev.S tk_oref_dev.S tk_ras_tex.S tk_rcv_mbf.S tk_rcv_mbx.S tk_rea_dev.S tk_ref_alm.S tk_ref_cyc.S tk_ref_dev.S tk_ref_flg.S tk_ref_idv.S 内容 T-Kernel/OS “tk_dis_wai” I/F T-Kernel/OS “tk_dly_tsk” I/F T-Kernel/OS “tk_ena_dsp” I/F T-Kernel/OS “tk_ena_tex” I/F T-Kernel/OS “tk_ena_wai” I/F T-Kernel/OS “tk_end_tex” I/F T-Kernel/SM “tk_evt_dev” I/F T-Kernel/OS “tk_evt_ssy” I/F T-Kernel/OS “tk_exd_tsk” I/F T-Kernel/OS “tk_ext_tsk” I/F T-Kernel/OS “tk_frsm_tsk” I/F T-Kernel/OS “tk_fwd_por” I/F T-Kernel/SM “tk_get_cfn” I/F T-Kernel/SM “tk_get_cfs” I/F T-Kernel/OS “tk_get_cpr” I/F T-Kernel/SM “tk_get_dev” I/F T-Kernel/OS “tk_get_mpf” I/F T-Kernel/OS “tk_get_mpl” I/F T-Kernel/OS “tk_get_otm” I/F T-Kernel/OS “tk_get_reg” I/F T-Kernel/OS “tk_get_res” I/F T-Kernel/OS “tk_get_rid” I/F T-Kernel/SM “tk_get_smb” I/F T-Kernel/OS “tk_get_tid” I/F T-Kernel/OS “tk_get_tim” I/F T-Kernel/OS “tk_get_tsp” I/F T-Kernel/OS “tk_inf_tsk” I/F T-Kernel/OS “tk_loc_mtx” I/F T-Kernel/SM “tk_lst_dev” I/F T-Kernel/SM “tk_opn_dev” I/F T-Kernel/SM “tk_oref_dev” I/F T-Kernel/OS “tk_ras_tex” I/F T-Kernel/OS “tk_rcv_mbf” I/F T-Kernel/OS “tk_rcv_mbx” I/F T-Kernel/SM “tk_rea_dev” I/F T-Kernel/OS “tk_ref_alm” I/F T-Kernel/OS “tk_ref_cyc” I/F T-Kernel/SM “tk_ref_dev” I/F T-Kernel/OS “tk_ref_flg” I/F T-Kernel/SM “tk_ref_idv” I/F

(23/70)

表 3.8 lib 目录下的系统相关文件列表(5) 目录名 libsvc/src/sysdepend/<TARGET> 文件名 tk_ref_mbf.S tk_ref_mbx.S tk_ref_mpf.S tk_ref_mpl.S tk_ref_mtx.S tk_ref_por.S tk_ref_sem.S tk_ref_smb.S tk_ref_ssy.S tk_ref_sys.S tk_ref_tex.S tk_ref_tsk.S tk_ref_ver.S tk_rel_mpf.S tk_rel_mpl.S tk_rel_smb.S tk_rel_wai.S tk_ret_int.S tk_rot_rdq.S tk_rpl_rdv.S tk_rsm_tsk.S tk_set_cpr.S tk_set_flg.S tk_set_pow.S tk_set_reg.S tk_set_rid.S tk_set_tim.S tk_set_tsp.S tk_sig_sem.S tk_sig_tev.S tk_slp_tsk.S tk_snd_mbf.S tk_snd_mbx.S tk_srea_dev.S tk_sta_alm.S tk_sta_cyc.S tk_sta_ssy.S tk_sta_tsk.S tk_stp_alm.S tk_stp_cyc.S 内容 T-Kernel/OS “tk_ref_mbf” I/F T-Kernel/OS “tk_ref_mbx” I/F T-Kernel/OS “tk_ref_mpf” I/F T-Kernel/OS “tk_ref_mpl” I/F T-Kernel/OS “tk_ref_mtx” I/F T-Kernel/OS “tk_ref_por” I/F T-Kernel/OS “tk_ref_sem” I/F T-Kernel/OS “tk_ref_smb” I/F T-Kernel/OS “tk_ref_ssy” I/F T-Kernel/OS “tk_ref_sys” I/F T-Kernel/OS “tk_ref_tex” I/F T-Kernel/OS “tk_ref_tsk” I/F T-Kernel/OS “tk_ref_ver” I/F T-Kernel/OS “tk_rel_mpf” I/F T-Kernel/OS “tk_rel_mpl” I/F T-Kernel/OS “tk_rel_smb” I/F T-Kernel/OS “tk_rel_wai” I/F T-Kernel/OS “tk_ret_int” I/F T-Kernel/OS “tk_rot_rdq” I/F T-Kernel/OS “tk_rpl_rdv” I/F T-Kernel/OS “tk_rrm_tsk” I/F T-Kernel/OS “tk_set_cpr” I/F T-Kernel/OS “tk_set_cpr” I/F T-Kernel/OS “tk_set_pow” I/F T-Kernel/OS “tk_set_reg” I/F T-Kernel/OS “tk_set_rid” I/F T-Kernel/OS “tk_set_tim” I/F T-Kernel/OS “tk_set_tsp” I/F T-Kernel/OS “tk_sig_sem” I/F T-Kernel/OS “tk_sig_tev” I/F T-Kernel/OS “tk_slp_tsk” I/F T-Kernel/OS “tk_snd_mbf” I/F T-Kernel/OS “tk_snd_mbx” I/F T-Kernel/OS “tk_srea_dev” I/F T-Kernel/OS “tk_sta_alm” I/F T-Kernel/OS “tk_sta_cyc” I/F T-Kernel/OS “tk_sta_ssy” I/F T-Kernel/OS “tk_sta_tsk” I/F T-Kernel/OS “tk_stp_alm” I/F T-Kernel/OS “tk_stp_cyc” I/F

(24/70)

表 3.9 lib 目录下的系统相关文件列表(6) 目录名 libsvc/src/sysdepend/<TARGET> 文件名 tk_sus_dev.S tk_sus_tsk.S tk_swri_dev.S tk_ter_tsk.S tk_unl_mtx.S tk_wai_dev.S tk_wai_flg.S tk_wai_sem.S tk_wai_tev.S tk_wri_dev.S tk_wup_tsk.S unlockspace.S unmakespace.S unmapmemory.S writememspace.S _getkernelcommonarea.S _syslog_send.S libtk/src/sysdepend/<TARGET> disint.S getsvcenv.h int.c prreg.c setspc.c waitnsec.c waitusec.c libtm/src/sysdepend/<TARGET> tmsvc.h 内容 T-Kernel/OS “tk_sus_dev” I/F T-Kernel/OS “tk_sus_tsk” I/F T-Kernel/OS “tk_swri_dev” I/F T-Kernel/OS “tk_ter_tsk I/F T-Kernel/OS “tk_unl_mtx” I/F T-Kernel/OS “tk_wai_dev” I/F T-Kernel/OS “tk_wai_flg” I/F T-Kernel/OS “tk_wai_sem” I/F T-Kernel/OS “tk_wai_tev” I/F T-Kernel/OS “tk_wri_dev” I/F T-Kernel/OS “tk_wup_tsk” I/F 程序库函数“UnlockSpace”I/F 程序 程序库函数“UnMakeSpace”I/F 程序 程序库函数“UnMapMemory”I/F 程序 程序库函数“WriteMemSpace”I/F 扩展 SVC“GetKernelCommonArea”I/F 扩展 SVC“_syslog_send”I/F 中断控制函数定义 SVC 环境获取函数定义 中断控制函数定义 寄存器信息显示函数定义 任务固有空间设置函数定义 延时函数(纳秒级)定义 延时函数(微秒级)定义 TMCALL 汇编宏定义

(1)

build/<TARGET>/Makefile

构建环境定义
[类别] 构建环境定义 [定义内容] 创建如表 3.4 中的<TARGET>,<MACHINE>相关的构建目录,在各目录下创建 Makefile。使用 Makefile.common 时复制既存的 Makefile,仅更改 TETYPE、MACHINE 即可。

(25/70)

(2)

crt/crt0/src/sysdepend/<TARGET>/crt0.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数 START。 本函数在 T-Kernel 中最先被调用, 并转向 crttk 内定义的_startup 函数。

(3)

crt/crt0/src/sysdepend/<TARGET>/crti.S

.fini、.init 部分内用函数定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数 fini 与 init。 [备注] 关于.fini 部分、.init 部分的详细内容,参阅 GCC 以及 ELF 格式的有关资料进行实施。

(4)

crt/crt0/src/sysdepend/<TARGET>/crtn.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 在汇编程序中仅定义.fini 部分、.ini 部分的各返回命令。参阅 GCC 以及 ELF 格式的资料进行实施。

(5)

crt/crt0/src/sysdepend/<TARGET>/crtir.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数_fini 与_init。(根据实施内容不同也可能不准备本文件。)

(6)

crt/crt0/src/sysdepend/<TARGET>/crt1f.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数_fini 与_init。由于本文件在 T-Kernel/SE 中使用,因此根据系统的不同,在开 放版源代码中也存在有未准备本文件的实施。

(26/70)

(7)

crt/crt0/src/sysdepend/<TARGET>/crt1s.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数中使用的符号。由于本文件在 T-Kernel/SE 中使用,因此根据系统的不同,在 开放版源代码中也存在有未准备本文件的实施。

(8)

crt/crttk/src/sysdepend/<TARGET>/asmstartup.S

汇编程序启动定义
[类别] 汇编程序描述函数定义 [定义内容] 定义汇编程序启动函数(C_startup)。本函数执行以下处理。 ? 从.data 部分的 ROM 复制到 RAM ? .bss 部分初始化 ? 转向_P_startup 函数(在 crt/crttk/src/pstartup.c 中定义)

(9)

libtk/build/<MACHINE>/makeiftk.pl

T-Kernel 系统调用接口自动生成用 PERL 脚本定义
[类别] PERL 脚本定义 [定义内容] 用于自动生成 T-Kernel/OS 系统调用接口程序的 PERL 脚本。按照实施规格第 5 章定义的接口以及软 件中断编号进行实施。

(10) libtk/build/<MACHINE>/makeiftd.pl T-Kernel/DS 系统调用接口自动生成用 PERL 脚本定义
[类别] PERL 脚本定义 [定义内容] 用于自动生成 T-Kernel/DS 系统调用接口程序的 PERL 脚本。定义与按照实施规格第 5 章定义的接口 以及软件中断编号实施的 TARGET 相对应的各类符号。

(11) libtk/build/<MACHINE>/makeifex.pl 扩展 SVC 接口自动生成用 PERL 脚本定义
[类别] PERL 脚本定义 [定义内容] 用于自动生成扩展 SVC 调用接口程序的 PERL 脚本。 定义与按照实施规格第 5 章定义的接口以及软件 中断编号实施的 TARGET 相对应的各类符号。

(27/70)

(12) libsvc/src/<MACHINE>/*.S T-Kernel 系统调用及扩展 SVC 调用接口定义
[类别] 汇编程序函数定义 [定义内容] 定义 T-Kernel 系统调用以及扩展 SVC 调用的汇编程序接口函数。也可以通过 PERL 脚本自动生成。 无法使用 PERL 脚本时, 各汇编程序文件按照实施规格第 5 章定义的接口以及软件中断编号进行实施。 要通过 PERL 脚本生成汇编程序文件,需要在构建目录下执行以下命令。 $ make source

(13) libtk/src/sysdepend/<TARGET>/disint.S disint
[类别] 汇编程序语言函数定义 [定义内容] 实施 disint 函数(禁止中断)。DI 宏主体。接口如下。 UINT disint(void);

enaint
[类别] 汇编程序语言函数定义 [定义内容] 实施 enaint 函数(允许中断)。EI 宏主体。接口如下。 UINT enaint(UINT intsts);

(14) libtk/src/sysdepend/<TARGET>/int.c EnableInt
[类别] C 语言 or 汇编程序函数实施 [定义内容] 实施 EnableInt 函数。 [备注] 中断控制函数与实施相关,如无法实施时也可以不实施。(参阅 T-Kernel 规格书第 5.4 章)

DisableInt
[类别] C 语言 or 汇编程序函数实施 [定义内容] 实施 DisableInt 函数。 [备注] 中断控制函数与实施相关,如无法实施时也可以不实施。(参阅 T-Kernel 规格书第 5.4 章)

(28/70)

ClearInt
[类别] C 语言 or 汇编程序函数 [定义内容] 实施 ClearInt 函数。 [备注] 中断控制函数与实施相关如无法实施时也可以不实施。(参阅 T-Kernel 规格书第 5.4 章)

CheckInt
[类别] C 语言 or 汇编程序函数 [定义内容] 实施 CheckInt 函数。 [备注] 中断控制函数与实施相关,如无法实施时也可以不实施。(参阅 T-Kernel 规格书第 5.4 章)

(15) libtk/src/sysdepend/<TARGET>/prreg.c PrintTaskRegister
[类别] C 语言函数 [定义内容] 实施 PrintTaskRegister 函数。接口如下。 EXPORT W PrintTaskRegister( int (*prfn)( const char *format, ... ), T_REGS *gr, T_EIT *er, T_CREGS *cr ); [备注] 本函数在目前版本的 T-Kernel 中未被使用。

(16) libtk/src/sysdepend/<TARGET>/setspc.c 任务固有空间设置定义
[类别] C 语言函数定义 [定义内容] 实施 T-Kernel/SM 程序库函数 SetTaskSpace。(参阅 T-Kernel 规格书第 5.2 章“地址空间管理功能”)

(29/70)

(17) libtk/src/sysdepend/<TARGET>/waitusec.c 延时函数 WaitUsec
[类别] C 语言函数 [定义内容] 实施 T-Kernel/SM 程序库函数 WaitUsec(微秒级)。(参阅 T-Kernel 规格书第 5.5 章“I/O 端口访问 支持功能”) [备注] 在开放版源代码的实施中使用了系统共享信息的 loop64us 参数,以 busy 循环消耗等待时间。

(18) libtk/src/sysdepend/<TARGET>/waitnsec.c 延时函数 WaitNsec
[类别] C 语言函数 [定义内容] 实施 T-Kernel/SM 程序库函数 WaitNsec(纳秒级)。(参阅 T-Kernel 规格书第 5.5 章“I/O 端口访问 支持功能”) [备注] 在开放版源代码的实施中使用了系统共享信息的 loop64us 参数,以 busy 循环消耗等待时间。

(19) libtm/src/sysdepend/<TARGET>/tmsvc.h _TMCALL 汇编宏定义
[类别] 汇编宏定义 [定义内容] 实施 T-Monitor(程序支持功能)监控服务函数的接口_TMCALL 宏。 [备注] 本宏在 libtm/src/*.s 文件中被使用。

(30/70)

3.2.5 “kernel”目录
Kernel 目录下的系统相关文件如表 3.10 所示。 表 3.10 Kernel 目录的系统相关文件 目录名 sysinit/build/<TARGET> sysmgr/build/<TARGET> tkernel/build/<TARGET> sysmain/build/<TARGET> 文件名 Makefile Makefile Makefile Makefile kernel-rom.lnk sysdepend/cpu/<MACHINE> cache.c chkplv.c cpu_calls.c cpu_conf.h cpu_init.c cpu_insn.h cpu_status.h cpu_support.s cpu_task.h offset.h sysdepend/device/<TARGET> cache_info.h cntwus.c devinit.c icrt0.s patch.c patch.h power.c tkdev_conf.h tkdev_init.c tkdev_timer.h 内容 MACHINE, TETYPE 名更改 MACHINE, TETYPE 名更改 MACHINE, TETYPE 名更改 MACHINE, TETYPE 名更改 链接脚本 缓存设置 保护级别检查 <MACHINE>相关的系统调用内部函数定义 <MACHINE>相关的 OS 配置信息定义 <MACHINE>相关的初始化处理 <MACHINE>相关的宏函数 <MACHINE>相关的宏定义 中断/调度处理 <MACHINE>相关的任务启动处理定义 TCB 信息数据偏移符号 缓存控制宏 系统定时器设置 <TARGET>相关的设备初始化处理 <TARGET>相关的启动处理 补丁处理(打补丁) 补丁处理(打补丁) 电源管理处理 系统定时器设置用符号定义 设备初始化处理 系统定时器设置用宏、函数定义

(1)

kernel/*/build/<TARGET>/Makefile

Makefile
[类别] 构建步骤定义(Makefile) [定义内容] 创建如表 3.10 中的<TARGET>相关的构建目录,在各目录下创建 Makefile。使用 Makefile.common 时 复制既存的 Makefile,仅更改 TETYPE、MACHINE 即可。

(31/70)

(2)

sysmain/build/<TARGET>/kernel-rom.lnk

链接脚本
[类别] 链接脚本 [定义内容] T-Kernel 本体用链接脚本。参阅开放版源代码或 GCC 手册进行创建。

(3)

sysdepend/cpu/<MACHINE>/cache.c

FlushCache
[类别] C 语言函数 [定义内容] 实施缓存的刷新函数 FlushCache。对从 laddr 起始的 len 字节长度的缓存进行刷新。 [定义范例] EXPORT void FlushCache( VP laddr, INT len ) { }

FlushCacheM
[类别] C 语言函数 [定义内容] 实施缓存的刷新函数 FlushCacheM。接口如下。 void FlushCacheM(VP laddr, INT len, UINT mode); 对从 laddr 起始的 len 字节长度的缓存进行刷新,并设置为 mode 指定的缓存模式。 [定义范例] EXPORT void FlushCacheM( VP laddr, INT len, UINT mode ) { }

(4)

sysdepend/cpu/<MACHINE>/chkplv.c

ChkCallPLevel
[类别] C 语言函数 [定义内容] 实施保护级别检查函数 ChkCallPLevel。接口如下。 void ChkCallPLevel( void ); 本函数在 T-Kernel/SM 的扩展 SVC 入口中使用。 (参阅 T-Kernel 规格书第 5 章 “T-Kernel/SM 的功能” (整体注意事项及补充事项)) [定义范例] 检查当前的保护级别,当其低于系统共享信息的 TSVCLimit(svc_call_limit 变量)所表示的保护级别 时返回访问权限错误 E_OACV。正常结束时返回 E_OK。

(32/70)

(5)

sysdepend/cpu/<MACHINE>/cpu_calls.c

_tk_dis_dsp
[类别] C 语言函数 [定义内容] 实施_tk_dis_dsp 函数。本函数是 tk_dis_dsp 系统调用(禁止调度)的内部函数。 [定义范例] [1] [2] 检查当前的环境(CHECK_CTX 宏) 将 DDS_DISABLE 设置为 dispatch_disable 变量

_tk_ena_dsp
[类别] C 语言函数 [定义内容] 实施_tk_ena_dsp 函数。本函数是 tk_ena_dsp 系统调用(允许调度)的内部函数。 [定义范例] [1] [2] [3] 检查当前的环境(CHECK_CTX 宏) 将 DDS_ENABLE 设置为 dispatch_disable 变量 当前环境与下一次跳转的环境不同时调用调度程序,进行任务调度。

_tk_def_int
[类别] C 语言函数 [定义内容] 实施_tk_def_int 函数。本函数是 tk_def_int 系统调用(中断处理程序定义)的内部函数。 [定义范例] [1] [2] 检查参数 dintno(中断定义编号)的值是否正确。(错误时返回 E_PAR) pk_dint 不为 NULL 时,进行中断处理程序注册。设置为 TA_HLNG 属性时,注册到 hll_inthdr 地址表(数组),并将高级语言对应程序注册到中断矢量表。 TA_ASM 属性时,注册到中断矢量表。(对地址表的访问期间禁止中断) pk_dint 为 NULL 时,从地址表中清除注册处理程序。当 T-Monitor 等预先设置了中断时,恢复 SaveMonHdr 数据表的地址。 (对地址表的访问期间禁止中断。 使用 BEGIN_CRITICAL_SECTION、END_CRITICAL_SECTION 宏)

[3]

(33/70)

_tk_get_tsp
[类别] C 语言函数 [定义内容] 实施_tk_get_tsp 函数。本函数是 tk_get_tsp 系统调用(参照任务固有空间)的内部函数。 [定义范例] [1] [2] [3] 检查是否是来自任务无关部分,如来自任务无关部分则返回错误。 从 tskid 取出 TCB 信息。 从 TCB 信息读取 uatb 与 lsid,保存在返回数据包中。(访问 TCB 时禁止中断)

_tk_set_tsp
[类别] C 语言函数 [定义内容] 实施_tk_set_tsp 函数。本函数是 tk_set_tsp 系统调用(任务固有空间设置)的内部函数。 [定义范例] [1] [2] [3] [4] 检查是否是来自任务无关部分,如来自任务无关部分则返回错误。 从 tskid 取出 TCB 信息。TCB 状态为 NONEXIST 时返回错误。 从 pk_tskspc 数据包中读取 uatb 与 lsid,保存到 TCB 信息中。(访问 TCB 时禁止中断) 如有必要进行任务固有空间更改处理。

_tk_set_reg
[类别] C 语言函数 [定义内容] 实施_tk_set_reg 函数。本函数是 tk_set_reg 系统调用(任务寄存器设置)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_INTSK,CHECK_TSKID,CHECK_NONSELF 宏) 从 tskid 取出 TCB 信息。TCB 状态为 NONEXIST 时返回错误。 从 pk_regs, pk_eit, pk_cregs 数据包中读取寄存器设置值,保存到 TCB 内的寄存器信息中。

(调用 set_reg 函数并设置)。 设置时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION 宏) [备注] 在开放版源代码中,寄存器的设置另行准备了子函数 set_reg 函数。

(34/70)

_tk_get_reg
[类别] C 语言函数 [定义内容] 实施_tk_get_reg 函数。本函数是 tk_get_reg 系统调用(任务寄存器的获取)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_INTSK,CHECK_TSKID,CHECK_NONSELF 宏) 从 tskid 取出 TCB 信息。TCB 状态为 NONEXIST 时返回错误。 从 TCB 信息中读取任务寄存器信息,保存到 pk_regs,pk_eit,pk_cregs 数据包中。

(调用 get_reg 函数并设置)。 获取寄存器数据时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION) [备注] 在开放版源代码中,寄存器的获取另行准备了子函数 get_reg 函数。

_tk_set_cpr
[类别] C 语言函数 [定义内容] 实施_tk_set_cpr 函数。本函数是 tk_set_cpr 系统调用(协处理器寄存器的设置)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_INTSK,CHECK_TSKID,CHECK_NONSELF,CHECK_PAR 宏) 从 tskid 取出 TCB 信息。TCB 状态为 NONEXIST 时返回错误。 从 pk_copregs 数据包中读取寄存器设置值,保存到 TCB 信息中。

设置寄存器数据时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION)

_tk_get_cpr
[类别] C 语言函数 [定义内容] 实施_tk_get_cpr 函数。本函数是 tk_get_cpr 系统调用(协处理器寄存器的获取)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_INTSK,CHECK_TSKID,CHECK_NONSELF,CHECK_PAR 宏) 从 tskid 取出 TCB 信息。TCB 状态为 NONEXIST 时返回错误。 从 TCB 信息中读取协处理器寄存器信息,保存到 pk_copregs 数据包中。

获取寄存器数据时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION)

(35/70)

_td_set_reg
[类别] C 语言函数 [定义内容] 实施_td_set_reg 函数。本函数是 td_set_reg 系统调用(任务寄存器设置)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_TSKID 宏) 从 tskid 取出 TCB 信息。当 TCB 为当前运行中的任务时,或者为 NONEXIST 时返回错误。 从 pk_regs,pk_eit,pk_cregs 数据包中读取寄存器设置值,保存到 TCB 内的寄存器信息中。

(调用 set_reg 函数并设置)。 设置时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION 宏) [备注] 在开放版源代码中寄存器设置另行准备了 set_reg 函数,当定义了 USE_BDGSPT 时为有效。(#if USE_DBGSPT .. #endif )

_td_get_reg
[类别] C 语言函数 [定义内容] 实施_td_get_reg 函数。本函数是 td_get_reg 系统调用(任务寄存器的获取)的内部函数。 [定义范例] [1] [2] [3] 进行错误检查。(CHECK_TSKID 宏) 从 tskid 取出 TCB 信息。当 TCB 为当前运行中的任务时以及为 NONEXIST 时返回错误。 从 TCB 信息中读取任务寄存器信息,保存到 pk_regs,pk_eit,pk_cregs 数据包中。

(调用 get_reg 函数并设置)。 获取寄存器数据时禁止中断(BEGIN_CRITICAL_SECTION,END_CRITICAL_SECTION) [备注] 在开放版源代码中寄存器的设置另行准备了 get_reg 函数, 另外当定义了 USE_BDGSPT 时为有效。 (#if USE_DBGSPT .. #endif )

(36/70)

(6)

sysdepend/cpu/<MACHINE>/cpu_conf.h

OS 配置信息定义
[类别] 符号定义 [定义内容] 定义与<MACHINE>相对应的 OS 配置用的各类符号。这些设置用于编译时的条件判断。 USE_MMU USE_SINGLE_STACK MIN_SYS_STACK_SIZE MAX_LSID [定义范例] #define USE_MMU 0 1 #define USE_SINGLE_STACK #define MAX_LSID 255 是否使用 MMU 是否以单堆栈形式使用 最小系统堆栈容量 最大逻辑空间 ID

#define MIN_SYS_STACK_SIZE 256

(7)

sysdepend/cpu/<MACHINE>/cpu_init.c

cpu_initialize
[类别] C 语言函数 [定义内容] 定义<MACHINE>相关的 CPU 初始化函数 cpu_initialize。 [定义范例] [1] [2] [3] [备注] 本函数被 t_kernel_main 函数(kernel/tkernel/src/tkstart.c 中定义)调用。 将 T-Monitor 中使用的异常及中断处理程序地址备份到专用数据表中。 注册 T-Kernel 中使用的异常及中断处理程序(向矢量表进行地址设置)。 使用协处理器时,对软件标记(available_cop 等)进行初始设置。

cpu_shutdown
[类别] C 语言函数 [定义内容] 定义<MACHINE>相关的 CPU 结束处理函数 cpu_shutdown。 [定义范例] [1] [备注] 本函数被 t_kernel_shutdown 函数(kernel/tkernel/src/tkstart.c 中定义)调用。 恢复 T-Kernel 中使用的异常及中断处理程序地址(向矢量表进行地址设置)。

(37/70)

request_tex
[类别] C 语言函数 [定义内容] 定义任务异常处理程序启动请求处理函数 request_tex。 [定义范例] [1] [备注] 本函数被_tk_ras_tex 函数、_tk_end_tex 函数(kernel/tkernel/src/subsystem.c 中定义)调用。 检查 TCB 信息的保护级别,如保护级别为 0 时设置 TCB 信息的 reqdct 标记。

setup_texhdr
[类别] C 语言函数 [定义内容] 定义任务异常处理程序启动处理函数 setup_texhdr。 [定义范例] [1] [2] [3] [4] [备注] 本函数被 dct_startuo 函数(kernel/sysdepend/cpu/<MACHINE>/cpu_support.s 中定义)调用。由于 API 根据具体实施不同而存在差异,因此最好配合 dct_startup 函数的实施进行实施。 清除当前运行中的任务环境的 TCB 信息的 reqdct 标记。 检查任务异常代码,如在范围外则返回错误。 更改 TCB 内的任务异常函数变量。(exectex,pendtex,texflg) 设置任务异常处理程序地址。在开放版源代码中,M32R 版设置返回值,其他情况则在堆栈中 设置处理程序地址。

(8)

sysdepend/cpu/<MACHINE>/cpu_status.h

BEGIN_CRITICAL_SECTION
[类别] C 语言宏 [定义内容] 定义 C 语言宏 BEGIN_CRITICAL_SECTION(临界区入口处理)。 [定义范例] [1] [备注] 在开放版源代码中为本宏与 END_CRITICAL_SECTION 宏成对使用的规格。 本宏最好能够配合 END_CRITICAL_SECTION 宏的实施进行实施。 禁止中断(disint),保存禁止前的中断级别。

(38/70)

END_CRITICAL_SECTION
[类别] C 语言宏 [定义内容] 定义 C 语言宏 END_CRITICAL_SECTION(临界区出口处理)。 [定义范例] [1] [2] [备注] 在开放版源代码中为本宏与 BEGIN_CRITICAL_SECTION 宏成对使用的规格。 本宏最好能够配合 BEGIN_CRITICAL_SECTION 宏的实施进行实施。 仅在满足如下条件时调用调度程序。(无等待处理的中断,存在等待任务计划的任务,非任务 无关部分,处在允许调度状态) 允许中断(enaint),返回 BEGIN_CRITICAL_SECTION 设置前的中断级别。

BEGIN_DISABLE_INTERRUPT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 BEGIN_DISABLE_INTERRUPT(禁止中断区间入口处理)。 [定义范例] [1] [备注] 在开放版源代码中为本宏与 END_DISABLE_INTERRUPT 宏成对使用的规格。 本宏最好能够配合 END_DISABLE_INTERRUPT 宏的实施进行实施。 禁止中断(disint),保存禁止前的中断级别。

END_DISABLE_INTERRUPT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 END_DISABLE_INTERRUPT(禁止中断区间出口处理)。 [定义范例] [1] [备注] 在开放版源代码中为本宏与 BEGIN_DISABLE_INTERRUPT 宏成对使用的规格。 本宏最好能够配合 BEGIN_DISABLE_INTERRUPT 宏的实施进行实施。 将中断级别返回到 BEGIN_DISABLE_INTERRUPT 执行前的中断级别。(enaint)

ENABLE_INTERRUPT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 ENABLE_INTERRUPT(允许中断)。 [定义范例] [1] 将中断级别设置为 0(允许所有中断)(enaint 调用)

(39/70)

DISABLE_INTERRUPT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 DISABLE_INTERRUPT(禁止中断)。 [定义范例] [1] 禁止中断。(disint 调用)

ENABLE_INTERRUPT_UPTO
[类别] C 语言宏 [定义内容] 定义 C 语言宏 ENABLE_INTERRUPT_UPTO(将中断级别设置为指定级别)。 [定义范例] [1] [备注] 在开放版源代码中也存在无法通过 CPU 更改中断允许级别的情况,此时用实施 enaint(0)的方法代替。 将中断级别设置为指定级别 level。(enaint 调用)

ENTER_TASK_INDEPENDENT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 ENTER_TASK_INDEPENDENT(跳转至任务无关部分)。 [定义范例] 将堆栈指针更改为指向中断堆栈。 #define ENTER_TASK_INDEPENDENT { \ nesting_interrupt_count++; \ \ if(nesting_interrupt_count == 1){ \ Asm("mov sp, %0" : "=r"(savedsp_TaskIndependent) :: "memory"); \ Asm("mov %0 , sp" : : "r"(INTSTACKTOP_ADDR) : "r15"); \ } } [备注] 本函数在即时启动周期处理程序以及警报处理程序时通过与 LEAVE_TASK_INDEPENDENT 宏成对 使用来进行调用。在开放版源代码中也存在根据<TARGET>不同导致实施存在差异的情况,最好参考 既存的实施进行适应于对象系统的实施。 \

(40/70)

LEAVE_TASK_INDEPENDENT
[类别] C 语言宏 [定义内容] 定义 C 语言宏 LEAVE_TASK_INDEPENDENT(从任务无关部分的恢复)。 [定义范例] 将堆栈指针从中断堆栈更改为指向用户堆栈。 [备注] 本函数在即时启动周期性处理程序以及警报处理程序时通过与 ENTER_TASK_INDEPENDENT 宏成 对使用来进行调用。在开放版源代码中也存在因<TARGET>不同而导致实施存在差异,最好参考既存 的实施进行适应于对象系统的实施。

in_indp
[类别] C 语言宏 [定义内容] 定义 C 语言宏 in_indo(任务无关部分判断)。 [定义范例] 当为任务无关部分(isTaskIndependent 宏)或当前任务环境为 NULL 时返回 TRUE。 #define in_indp() [备注] 本函数在执行系统调用时,用于检查是否为来自任务无关部分的调用。 ( isTaskIndependent() || ctxtsk == NULL )

in_ddsp
[类别] C 语言宏 [定义内容] 定义 C 语言宏 in_ddsp(调度禁止判断)。 [定义范例] 满足以下条件时返回 TRUE。 (调度禁止变量的值为调度禁止(dispatch_disable != NULL)、任务无关部分(in_indp 调用)、禁止 中断状态(isDI 调用)) #define in_ddsp() [备注] 本函数在执行系统调用时,用于检查是否为调度禁止状态。 ( dispatch_disabled || in_indp() || isDI(getSR()) )

(41/70)

in_loc
[类别] C 语言宏 [定义内容] 定义 C 语言宏 in_loc (CPU 锁定状态判断) 。当为任务无关部分(in_indp 调用) 或处于禁止中断(isDI 调用)时返回 TRUE。 [定义范例] #define in_loc() [备注] 本函数在执行系统调用时,用于检查是否处在 CPU 锁定状态(禁止中断)。 ( isDI(getSR()) || in_indp() )

in_qtsk
[类别] C 语言宏 [定义内容] 定义 C 语言宏 in_qtsk 准任务状态判断)比较 TCB 信息的 sysmode 与 isysmode, sysmode > isysmode ( 。 当 时返回 TRUE(准任务状态)。 [定义范例] #define in_qtsk() [备注] 本函数在执行系统调用时,用于检查是否为准任务状态。 ( ctxtsk->sysmode > ctxtsk->isysmode )

dispatch_request
[类别] C 语言宏 [定义内容] 定义 C 语言宏 dispatch_request(调度请求)。 [定义范例] #define dispatch_request() /* */ [备注] 在开放版源代码中根据系统的不同造成实施存在差异,在 SH/M32R 中由于是从 END_CRITICAL_SECTION 宏中调用 dispatch 函数,因此本函数不做任务操作。(仅在通过微机的功 能支持延迟中断的情况下才实施本函数)

(42/70)

force_dispatch
[类别] C 语言函数 [定义内容] 定义 C 语言函数 force_dispatch(调度程序即时启动)。 [定义范例] 转向 dispatch_to_schedtsk 函数。 Inline void force_dispatch( void ) { IMPORT void Asm(" " } [备注] 在开放版源代码中描述有 ASM 命令(汇编程序)。 dispatch_to_schedtsk(); \n" "

jmp @%0 nop

:: "r"(&dispatch_to_schedtsk));

dispatch
[类别] C 语言宏 [定义内容] 定义 C 语言宏 dispatch(调度程序调用)。 [定义范例] 触发产生软件中断。 Inline void dispatch( void ) { Asm("trapa %0":: "i"(TRAP_DISPATCH)); } [备注] 在开放版源代码中根据系统不同导致实施存在差异,在 SH/M32R 中由于是从 END_CRITICAL_SECTION 宏中调用本函数执行调度,因此在 force_dispatch 函数中不做任务操作。

(43/70)

CTXB 结构体
[类别] 结构体的类型定义 [定义内容] 进行 CTXB(任务环境块)结构体的类型定义。 [定义范例] 在开放版源代码中,由堆栈指针、任务页面表、任务空间 ID 组成,是 TCB 结构体中的一个元素。 typedef struct { VP ssp; VP uatb; INT lsid; } CTXB; [备注] 在开放版源代码的当前版本 1.02.01 中,各处实施方法均相同。 /* System stack pointer */ /* Task space page table */ /* Task space ID */

(8)

sysdepend/cpu/<MACHINE>/cpu_insn.h

控制寄存器操作宏定义
[类别] 宏定义 [定义内容] 定义与<MACHINE>相对应的控制寄存器操作宏。本宏的名称与功能均为系统相关。 [定义范例] 以 M32192 用 getPSW 宏作为示例。 Inline UINT getPSW( void ) { UINT psw; Asm("mvfc %0, psw" : "=r"(psw)); return psw; } [备注] 在 SH 中定义了 getSR。

(44/70)

MONHDR 结构体类型定义
[类别] 结构体的类型定义 [定义内容] MONHDR 结构体的类型定义。备份 T-Monitor 中使用的异常及中断处理程序地址的地址表结构体。 [定义范例] typedef struct monhdr { FP default_hdr; FP monitor_hdr; FP break_hdr; } MONHDR;

define_inthdr
[类别] C 语言函数定义 [定义内容] 定义 define_inthdr 内联函数。 [定义范例] 将中断处理程序地址注册到中断矢量表(数组)中。 Inline void define_inthdr( INT vecno, FP inthdr ) { SCArea->intvec[vecno] = inthdr; }

isTaskIndependent
[类别] C 语言函数定义 [定义内容] 定义 isTaskIndependent 内联函数。 [定义范例] 为任务无关部分时返回 TRUE。 Inline BOOL isTaskIndependent( void ) { return ( ( getSP() > SH7145INNERRAMTOP_ADDR )? TRUE : FALSE ); }

(45/70)

(9)

sysdepend/cpu/<MACHINE>/offset.h

TCB 数据偏移定义
[类别] 符号定义 [定义内容] 定义表示 TCB 结构体入口的偏移值的符号。 [定义范例] 表示指向 TCB 结构体入口的偏移值(字节)。 #define TCB_tskid [备注] 本文件中定义的符号在 sysdepend/cpu/<MACHINE>/cpu_support.s 中使用。 8 #define TCB_tskatr 16

(10) sysdepend/cpu/<MACHINE>/cpu_support.S
本文件中定义的汇编程序函数与定义根据实施的不同而存在差异,实施时需要仔细探讨之后进行描 述。对于 SH/M32R,由于其支持 SH-2, 3, 4 以及 M32R,因此参考其中任何一种都有效。

Csym(dispatch_to_schedtsk)
[类别] 汇编程序函数定义 [定义内容] 定义 dispatch_to_schedtsk(汇编程序)。本函数被 force_dispatch()函数调用。 [定义范例] [1] [2] [3] [4] [5] 切换临时堆栈。 将 1(DDS_DISABLE_IMPLICIT)设置为调度禁止变量(dispatch_disable)。 调试模式时将 ctxtsk 变量备份到任意的寄存器。(#if USE_DBGSPT .. #endif) 清除 ctxtsk 变量。 允许中断,转向“l_dispatch0”。

Csym(dispatch_entry)
[类别] 汇编程序函数定义 [定义内容] 定义 dispatch_entry 函数(汇编程序)。本函数被 dispatch()函数调用。(如果是采用软件中断的实施 则 dispatch 函数即为入口函数) [定义范例] [1] [2] 将备份在堆栈中的 CPU 状态寄存器的允许中断位设置为允许。 (恢复任务时为允许中断状态。如果是可以切换中断禁止级别的 CPU,则全部为允许中断) 转向(继续处理)ret_int_dispatch 函数。

(46/70)

_ret_int_dispatch
[类别] 汇编程序函数定义 [定义内容] 定义_ret_int_dispatch 函数(汇编程序)。本函数被_tk_ret_int 函数以及 dispatch_entry 函数调用。 [定义范例] [1] [2] [3] [4] [5] [备注] 访问 dispatch_disable 变量时需要设置为禁止中断。 将 1(DDS_DISABLE_IMPLICIT)设置为调度禁止变量(dispatch_disable)。 设置为允许中断。 将通用寄存器备份到堆栈中。 更新由 ctxtsk 变量所指定的 TCB 堆栈指针。 转向(继续处理)l_dispatch0“。

l_dispatch0
[类别] 汇编程序函数定义 [定义内容] 定义 l_dispatch0 函数 (汇编程序) 。本函数被_ret_int_dispatch 函数以及 dispatch_to_schedtsk 函数调用。 [定义范例] [1] [2] [3] [4] [备注] 各变量使用如下。 ctxtsk schedtsk lowpow_discnt low_pow 当前运行中任务的 TCB 信息 等待计划任务的 TCB 信息 低耗电模式切换禁止计数器(>0 则禁止调用 low_pow) 低耗电模式函数(参阅 T-Kernel 规格书第 5.6 章“省电功能”) 调试模式时转向 hook_stop_jmp 变量中设置的任务调度挂钩程序(stop 函数,默认为 ret_hook_stop)。(#if USE_DBGSPT .. #endif) 清除 ctxtsk 变量。 将 schedtsk 变量、lowpow_discnt 变量、low_pow 变量的地址分别读取到任意的通用寄存器中。 转向(继续处理)l_dispatch1。

(47/70)

l_dispatch1
[类别] 汇编程序函数定义 [定义内容] 定义 l_dispatch1 函数(汇编程序)。 [定义范例] [1] [2] [3] [4] 设置为允许中断。 检查 schedtsk 变量,不为 NULL(存在跳转的任务)时转向 l_dispatch2。 不转向 l_dispatch2 时,检查 lowpow_discnt,当允许转向低耗电模式函数时 子程序转向 low_pow。否则不做任何操作。 转向(继续处理)l_dispatch11。

l_dispatch11
[类别] 汇编程序函数定义 [定义内容] 定义 l_dispatch11 函数(汇编程序)。 [定义范例] [1] [2] 设置为允许中断。 转向 l_dispatch1。

l_dispatch2
[类别] 汇编程序函数定义 [定义内容] 定义 l_dispatch2 函数(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [7] [8] [备注] 恢复任务环境的处理在开放版源代码中使用宏(INT_RETURN,EXC_RETURN 等)进行。 将 shedtsk 变量设置为 ctxtsk 变量。(设置 TCB 信息) 从 ctxtsk(TCB)中取出堆栈指针地址,更新堆栈指针寄存器。 调试模式时转向 hook_exec_jmp 变量中设置的任务调度挂钩程序(exec 函数,默认为 ret_hook_exec)。(#if USE_DBGSPT .. #endif) 清除 dispatch_disable 变量。(设置为允许调度状态 DDS_ENABLE) 从 TCB 中取出 reqdct 标记状态,保存到任意的寄存器中。 恢复备份在堆栈中的寄存器。 检查 reqdct 标记,已设置有请求位时转向 dct_startup。 未设置时允许中断,恢复入口处理中备份的寄存器,恢复到任务环境中。

(48/70)

hook_stop
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的入口处理函数 hook_stop(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 在函数调用的前后寄存器将被备份,并且 ctxtsk 变量需要保存在任意寄存器中。 检查寄存器中保存的 ctxtsk 变量,为 NULL 时恢复到发起调用处。 保存当前的中断禁止级别,设置为允许中断。 从 hook_stopfn 变量中取出 stop 函数地址。 从 TCB 中取出任务 ID、任务状态、逻辑空间 ID,设置为参数。 调用 stop 函数。 恢复保存的中断禁止级别,恢复到发起调用处。

hook_exec
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的入口处理函数 hook_exec(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 在函数调用的前后寄存器将被备份,并且 ctxtsk 变量需要保存在任意一个寄存器中。 保存当前的中断禁止级别,设置为允许中断。 从 hook_execfn 变量中取出 exec 函数地址。 从 TCB 中取出任务 ID、逻辑空间 ID,设置为参数。 调用 exec 函数。 恢复保存的中断禁止级别,恢复到发起调用处。

hook_dsp
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的注册函数 hook_dsp(汇编程序)。 [定义范例] 将 hook_exec 函数地址、hook_stop 函数地址设置到 hook_exec_jmp 变量、hook_stop_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

(49/70)

unhook_dsp
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的取消注册函数 unhook_dsp(汇编程序)。 [定义范例] 将 ret_hook_exec 地址、ret_hook_stop 地址设置到 hook_exec_jmp 变量、hook_stop_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

Csym(defaulthdr_startup)
[类别] 汇编程序函数定义 [定义内容] 定义未定义中断处理程序高级语言程序 defaulthdr_startup(汇编程序)。 [定义范例] [1] [2] [备注] Defaulthdr_startup 函数是在 tk_def_int 系统调用时产生未定义中断时的高级语言程序。 考虑到产生未定 义中断的情况,可以在初始化时预先注册到中断矢量表中。 将矢量号以及矢量地址设置到任意的寄存器。 转向 l_inthdr1(inthdr_startup)。

(50/70)

Csym(inthdr_startup)
[类别] 汇编程序函数定义 [定义内容] 定义 TA_HLNG 属性的中断处理程序高级语言程序 inthdr_startup(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [7] [8] [备注] Inthdr_startup 根据实施的不同其处理存在巨大的差异,在允许多重中断的情况下需要对堆栈进行切换 处理。对于函数前后的寄存器的使用方法,最好在充分探讨之后进行描述。 设置为禁止中断。 将矢量号以及矢量地址设置到任意的寄存器。 将通用寄存器备份到堆栈中。 调试模式时转向 hook_ienter_jmp 变量中设置的中断处理程序挂钩程序(ienter 函数,默认为 ret_hook_ienter)。(#if USE_DBGSPT .. #endif) 从 hll_inthdr 地址表中取出 C 语言描述的中断处理程序地址,设置参数后子程序转向。 调试模式时转向 hook_ienter_jmp 变量中设置的中断处理程序挂钩程序(ileave 函数,默认为 ret_hook_ileave)。(#if USE_DBGSPT .. #endif) 恢复[3]中备份的寄存器。 调用 tk_ret_int(软件中断等)

hook_ienter
[类别] 汇编程序函数定义 [定义内容] 定义中断处理程序挂钩程序的入口处理函数 hook_ienter(汇编程序)。 [定义范例] [1] [2] [3] [4] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 从 hook_ienterfn 变量中取出 ienter 函数地址。 如有必要,需要将有可能被 ienter 函数破坏的寄存器备份到堆栈中。 设置参数 dintno 等,通过子程序调用 enter 函数。 恢复备份的寄存器,恢复到发起调用处。

(51/70)

hook_ileave
[类别] 汇编程序函数定义 [定义内容] 定义中断处理程序挂钩程序的入口处理函数 hook_ileave(汇编程序)。 [定义范例] [1] [2] [3] [4] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 从 hook_ileavefn 变量中取出 ileave 函数地址。 如有必要,需要将有可能被 ileave 函数改写的寄存器备份到堆栈中。 设置 dintno 等参数,通过子程序调用 leave 函数。 恢复备份的寄存器,恢复到发起调用处。

hook_int
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的注册函数 hook_int(汇编程序)。 [定义范例] 将 hook_ienter 函数地址、 hook_ileave 函数地址设置到 hook_ienter_jmp 变量、 hook_ileave_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

unhook_int
[类别] 汇编程序函数定义 [定义内容] 定义任务调度挂钩程序的取消注册函数 unhook_int(汇编程序)。 [定义范例] 将 ret_hook_ienter 地址、ret_hook_ileave 地址设置到 hook_ienter_jmp 变量、hook_ileave_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

(52/70)

Csym(_tk_ret_int)
[类别] 汇编程序函数定义 [定义内容] 定义 tk_ret_int 执行函数 Csym(_tk_ret_int)(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [备注] _tk_ret_int 根据实施的不同其处理存在巨大的差异,本函数的调用方法最好考虑到以下的处理 (l_nodispatch 或_ret_int_dispatch)进行实施。 由于不使用通过软件中断启动时的堆栈,因此将堆栈指针向后移动。 在多重中断的情况下不进行调度,因此转向 l_nodispatch。(延迟调度) 检查 dispatch_disable 变量,当禁止调度时转向 l_nodispatch。 比较 ctxtsk 变量与 schedtsk 变量,相同(当前任务环境与跳转的任务环境相同)时,转向 l_nodispatch。 转向_ret_int_dispatch。

l_nodispatch
[类别] 汇编程序函数定义 [定义内容] 定义 tk_ret_int 结束处理 l_nodispatch(汇编程序)。 [定义范例] [1] [备注] 根据实施不同使用 INT_RETURN 宏。 恢复备份到堆栈中的寄存器,恢复到发起调用处。

(53/70)

_svctbl
[类别] 汇编程序表定义 [定义内容] 定义系统调用地址表_svctbl。 [定义范例] .text .balign 4 _svctbl: .int Csym(no_support) #define _tk_ret_int no_support #include <sys/svc/tksvctbl.h> #undef _tk_ret_int [备注] 在开放版源代码中包含了 sys/svc/tksvctbl.h。

Csym(call_entry)
[类别] 汇编程序函数定义 [定义内容] 定义 T-Kernel/OS 系统调用入口 Csym(call_entry)(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [7] [8] 设置为禁止中断。 将必要的寄存器备份到堆栈中。 调试模式时转向 hook_enter_jmp 变量中设置的系统调用,扩展 SVC 挂钩程序(enter 函数,默 认为 ret_hook_enter)。(#if USE_DBGSPT .. #endif) 检查寄存器中设置的功能代码,为 0 以上时转向扩展 SVC 处理入口 l_esvc_function。 功能代码为不正确的编号时,设置错误编号(E_RSFN),转向[8]。 检查功能代码的参数计数器,如有必要备份到堆栈中。 从 svctbl 地址表中取出系统调用处理函数地址,进行函数的调用(子程序调用)。 l_retsvc 入口: 调试模式时转向 hook_leave_jmp 变量中设置的系统调用, 扩展 SVC 挂钩程序 (leave 函数,默认为 ret_hook_leave)。 (#if USE_DBGSPT .. #endif) [9] [10] [11] [12] [13] [备注] 系统调用处理函数的参数可通过寄存器传递,堆栈传递等不同的方式实施,另外根据编译器的不同函 数的调用规则也有可能存在差异,因此实施时需要注意。 从 svctbl 地址表中取出函数地址,进行子程序调用。 恢复[2]中备份的寄存器。 如是来自任务无关部分时转向 l_nodct。 检查 ctxtsk 的任务异常标记,如标记没有被设置则转向 l_nodct。 仅在设置有任务异常标记,并且 dispatch_disable 变量为允许调度时转向 dct_startup。

(54/70)

l_nodct
[类别] 汇编程序函数定义 [定义内容] 定义 call_entry 结束处理 l_nodct(汇编程序)。 [定义范例] [1] [备注] 根据实施不同使用 INT_RETURN 宏或 EXC_RETURN 宏。 恢复备份到堆栈中的寄存器,恢复到发起调用处。

l_esvc_function
[类别] 汇编程序函数定义 [定义内容] 定义扩展 SVC 入口函数 l_esvc_function(汇编程序)。 [定义范例] [1] [2] [备注] 实施时需要注意函数的调用规则。 将功能代码设置到寄存器中,通过子程序转向至 svc_ientry。 恢复到 Csym(call_entry)(No.8)。

hook_enter
[类别] 汇编程序函数定义 [定义内容] 定义系统调用及扩展 SVC 挂钩程序的入口处理函数 hook_enter(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 将必要的寄存器备份到堆栈中。 在堆栈中创建 TD_CALINF 数据。 检查功能代码,当其不到 0 时为系统调用,因此将参数设置到堆栈中。 从 hook_enterfn 变量中取出 enter 函数地址。通过子程序调用 enter 函数。 恢复备份的寄存器,恢复到发起调用处。

(55/70)

hook_leave
[类别] 汇编程序函数定义 [定义内容] 定义系统调用及扩展 SVC 挂钩程序的入口处理函数 hook_leave(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 设置必要的寄存器。 检查功能代码。 将参数设置到寄存器中。 从 hook_leavefn 变量中取出 leave 函数地址。通过子程序调用 leave 函数。 恢复备份的寄存器,恢复到发起调用处。

hook_svc
[类别] 汇编程序函数定义 [定义内容] 定义系统调用及扩展 SVC 挂钩程序的注册函数 hook_svc(汇编程序)。 [定义范例] 将 hook_enter 函数地址、hook_leave 函数地址设置到 hook_enter_jmp 变量、hook_leave_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

unhook_svc
[类别] 汇编程序函数定义 [定义内容] 定义系统调用及扩展 SVC 挂钩程序的取消注册函数 unhook_svc(汇编程序)。 [定义范例] 将 ret_hook_enter 地址、ret_hook_leave 地址设置到 hook_enter_jmp 变量、hook_leave_jmp 变量中。 [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

(56/70)

_tdsvctbl
[类别] 汇编程序表定义 [定义内容] 定义 T-Kernel/DS 系统调用地址表_tdsvctbl。 [定义范例] .text .balign 4 _tdsvctbl: .int Csym(no_support) #include <sys/svc/tdsvctbl.h>

[备注] 在开放版源代码中包含了 sys/svc/tdsvctbl.h。本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。

Csym(call_dbgspt)
[类别] 汇编程序函数定义 [定义内容] 定义 T-Kernel/OS 系统调用入口 Csym(call_entry)(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [7] [备注] 本函数仅在设置了调试模式时有效(#if USE_DBGSPT .. #endif)。 如有必要设置为禁止中断。 将必要的寄存器(链接寄存器等)备份到堆栈中。 检查设置在寄存器中的功能代码。 功能代码为不正确的编号时,设置错误号(E_RSFN),转向[7]。 从 tdsvctbl 地址表中取出函数地址,进行子程序调用。 恢复[2]中备份的寄存器。 进行结束处理(INT_RETURN 宏等),恢复到发起调用处。

(57/70)

Csym(timer_handler_startup)
[类别] 汇编程序函数定义 [定义内容] 定义系统定时器中断处理程序入口 Csym(timer_handler_startup)(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [备注] 实施时允许多重中断时,需要做多重中断的处理。 设置为禁止中断。 如有必要进行定时器清零。 将通用寄存器备份到堆栈中。 通过子程序调用 timer_handler 函数。 恢复[3]中备份的寄存器。 进行中断结束处理。(tk_ret_int 调用)

Csym(dct_startup)
[类别] 汇编程序函数定义 [定义内容] 定义任务异常处理程序启动函数 Csym(dct_startup)(汇编程序)。 [定义范例] [1] [2] [3] [4] [5] [6] [备注] 实施时注意任务异常处理程序以及 setup_texhdr 的 API。 设置为禁止中断。 将通用寄存器备份到堆栈中。 通过子程序调用任务异常处理程序安装函数 setup_texhdr。 恢复[2]中备份的寄存器。 任务异常处理程序地址为 NULL 时结束处理。(INT_RETURN 宏等) 设置任务异常处理程序地址,启动任务异常处理程序。(INT_RETURN 宏等)

(58/70)

(11) sysdepend/cpu/<TARGET>/cpu_task.h SstackFrame
[类别] 结构体类型定义 [定义内容] 进行 SStackFrame 结构体的类型定义。 [定义范例] typedef struct { VW mach; VW macl; VP pr; VP gbr; VW r[13]; /* r0-r1,r4-r14 */ VW r2; VW r3; VP pc; /* by hardware */ UW sr; /* by hardware */ } SStackFrame; [备注] SstackFrame 结构体的寄存器排列与通过_ret_int_dispatch 函数备份的寄存器排列相同。

setup_context
[类别] C 语言函数定义 [定义内容] 定义任务环境设置函数 setup_context。 [定义范例] [1] [2] [3] [4] [备注] 本函数被 make_dormant 函数(kernel/tkernel/src/task.c)调用。 从 TCB 中取出堆栈指针信息。 确保堆栈帧大小的区域。 在堆栈帧中设置 PC 等必要的信息。 更新 TCB 的堆栈指针信息。

(59/70)

setup_context
[类别] C 语言函数定义 [定义内容] 定义任务启动代码安装函数 setup_stacd。 [定义范例] [1] [2] [备注] 本函数被 tk_sta_tsk 函数(kernel/tkernel/src/task_manage.c)调用。 从 TCB 中取出堆栈帧信息。 将任务启动信息(启动代码、扩展信息)设置到寄存器。

cleanup_context
[类别] C 语言函数定义 [定义内容] 定义任务环境清除函数 cleanup_context。 [定义范例] [1] [2] 从 TCB 中取出逻辑空间信息。 进行缓存的清除处理与页面表初始化。

(12) sysdepend/device/<TARGET>/cache_info.h USE_NOCACHE_MEMTBL
[类别] 符号定义 [定义内容] 定义 USE_NOCACHE_MEMTBL 符号。存在非缓存对象的内存领域时定义为 1。。 [定义范例] #define USE_NOCACHE_MEMTBL (0) /* Do not use */

NoCacheMemoryTop
[类别] 符号定义 [定义内容] 定义 NoCacheMemoryTop 符号。存在非缓存对象的内存领域时定义首地址。。 [定义范例] #define NoCacheMemoryTop (0) /* Top address of non-cache area */

(60/70)

NoCacheMemoryEnd
[类别] 符号定义 [定义内容] 定义 NoCacheMemoryEnd 符号。存在非缓存对象的内存领域时定义尾地址。 [定义范例] #define NoCacheMemoryEnd (0) /* End address of non-cache area */

CachingAddr
[类别] C 语言宏定义 [定义内容] 定义 CachingAddr 宏。从 p 指定的页面编号中获得缓存对象地址。 [定义范例] #define CachingAddr(p) ( (VP)(p) )

NoCachingAddr
[类别] C 语言宏定义 [定义内容] 定义 NoCachingAddr 宏。从 p 指定的页面编号中获得非缓存对象地址。 [定义范例] #define NoCachingAddr(p) ( (VP)(p) )

toLogicalAddress
[类别] C 语言宏定义 [定义内容] 定义 toLogicalAddress 宏。将 paddr 指定的物理地址转换为逻辑地址。 [定义范例] #define toLogicalAddress(paddr) (VP)(paddr)

toPhysicalAddress
[类别] C 语言宏定义 [定义内容] 定义 toPhysicalAddress 宏。将 laddr 指定的逻辑地址变换为物理地址。 [定义范例] #define toPhysicalAddress(laddr) (VP)(laddr)

(61/70)

toNoCacheLogicalAddress
[类别] C 语言宏定义 [定义内容] 定义 toNoCacheLogicalAddress 宏。将 laddr 指定的缓存对象的逻辑地址变换为非缓存对象逻辑地址。 [定义范例] #define toNoCacheLogicalAddress(laddr) (VP)(laddr)

(13) sysdepend/device/<TARGET>/cntwus.c WaitLoop
[类别] C 语言函数 [定义内容] 定义 WaitLoop 函数。本函数是在 CountWaitUsec 函数使用的忙循环。

CountWaitUsec
[类别] C 语言函数 [定义内容] 定义 CountWaitUsec 函数。 本函数在 T-Kernel 启动时只被调用 1 次, 用于计算系统共享信息的 loop64us。 [备注] 通过事先计算 loop64us,将其作为静态数据设置到系统共享信息中以代替本函数,可以缩短 T-kernel 的启动时间。 在开放版的源代码中是作为倒计时的定时器进行计算的,因此使用增序计数器时要注意计算。

(14) sysdepend/device/<TARGET>/devinit.c DispProgress
[类别] C 语言函数 [定义内容] 定义 DispProgress 函数。本函数是表示 T-Kernel 的启动状态的函数。 [定义范例] EXPORT void DispProgress( W n ) { }

(62/70)

init_device
[类别] C 语言函数 [定义内容] 定义 init_device 函数。 [定义范例] [1] [2] [备注] 本函数被 init_system 函数(kernel/sysinit/src/sysstartup.c)调用。 计算系统共享信息的 loop64us。(调用 CountWaitUsec) 进行系统共享信息的参数设置。

start_device
[类别] C 语言函数 [定义内容] 定义 start_device 函数。 [定义范例] EXPORT ER start_device( void ) { return E_OK; } [备注] 本函数被 start_system 函数(kernel/sysinit/src/sysstartup.c)调用。

finish_device
[类别] C 语言函数 [定义内容] 定义 finish_device 函数。 [定义范例] EXPORT ER finish_device( void ) { return E_OK; } [备注] 本函数被 shutdown_system 函数(kernel/sysinit/src/sysstartup.c)调用。

(63/70)

restart_device
[类别] C 语言函数 [定义内容] 定义 restart_device 函数。 [备注] 本函数被 shutdown_system 函数(kernel/sysinit/src/sysstartup.c)调用。

(15) sysdepend/device/<TARGET>/icrt0.S START
[类别] 汇编程序函数 [定义内容] 定义 START 入口。本函数是 T-Kernel 中最先被执行的函数。 [定义范例] [1] [2] [3] [4] .data 部分的复制 .bss 部分的清除 设置 lowmem_top 变量以及 lowmem_limit 变量。Lowmem_top 设置 bss 尾地址或系统共享信息 的 ramtop 地址,lowmem_limit 设置系统共享信息的 ramend 地址。 转向 main 函数。

(16) sysdepend/device/<TARGET>/patch.c sysdepend_patch1
[类别] C 语言函数 [定义内容] 定义 sysdepend_patch1 函数。 [定义范例] EXPORT void sysdepend_patch1( void ) { /* Do nothing */ } [备注] 本函数是仅在定义了 USE_SYSDEPEND_PATCH1 时有效的函数,被 init_task 函数调用。 (kernel/sysinit/src/sysinit_main.c)

(64/70)

sysdepend_patch2
[类别] C 语言函数 [定义内容] 定义 sysdepend_patch2 函数。 [定义范例] EXPORT void sysdepend_patch2( void ) { /* Do nothing */ } [备注] 本函数是仅在定义了 USE_SYSDEPEND_PATCH2 时有效的函数,被 init_task 函数调用。 (kernel/sysinit/src/sysinit_main.c)

(17) sysdepend/device/<TARGET>/patch.h USE_SYSDEPEND_PATCH1
[类别] 符号 [定义内容] 定义 USE_SYSDEPEND_PATCH1 符号。如有必要定义为 1。 [定义范例] #define USE_SYSDEPEND_PATCH1 0

USE_SYSDEPEND_PATCH2
[类别] 符号 [定义内容] 定义 USE_SYSDEPEND_PATCH2 符号。如有必要定义为 1。 [定义范例] #define USE_SYSDEPEND_PATCH2 0

(18) sysdepend/device/<TARGET>/power.c low_pow
[类别] C 语言函数 [定义内容] 定义低耗电模式切换函数 low_pow。参阅 T-Kernel 规格书第 5.6 章“省电功能”。 [定义范例] EXPORT void low_pow( void ) { }

(65/70)

off_pow
[类别] C 语言函数 [定义内容] 定义挂起模式过渡函数 off_pow。参阅 T-Kernel 规格书第 5.6 章“省电功能”。 [定义范例] EXPORT void off_pow( void ) { }

(19) sysdepend/device/<TARGET>/tkdev_conf.h 系统定时器设置用符号定义
[类别] 符号定义 [定义内容] 系统定时器硬件设置用符号定义

(20) sysdepend/device/<TARGET>/tkdev_init.c tkdev_initialize
[类别] C 语言函数 [定义内容] 定义目标系统相关初始化函数 tkdev_initialize。 [定义范例] [1] [2] [3] [备注] 本函数被 t_kernel_main 函数(kernel/tkernel/src/tkstart.c)调用。 (使用 InitModule 宏以 InitModule(tkdev)的形式被调用) 设置中断控制器的禁止中断。 允许级联中断。 中断掩码的清除处理。

tkdev_exit
[类别] C 语言函数 [定义内容] 定义目标系统相关结束函数 tkdev_exit。 [定义范例] [1] [2] 禁止中断。(disint) T-Monitor 结束处理(tm_exit(0))。

(66/70)

(21) sysdepend/device/<TARGET>/tkdev_timer.h init_hw_timer
[类别] C 语言内联函数 [定义内容] 定义硬件定时器初始化内联函数 init_hw_timer。 [定义范例] [1] [2] [3] [备注] 本函数被 start_hw_timer 函数(tkdev_timer.h)调用。 进行硬件定时器的初始化。 根据系统共享信息的运行时钟、系统信息的定时器间隔(msec)计算定时器的设置值。 进行定时器启动处理。

start_hw_timer
[类别] C 语言内联函数 [定义内容] 定义硬件定时器启动函数 start_hw_timer。 [定义范例] [1] [2] [3] [备注] 本函数被 timer_initialize 函数(kernel/tkernel/src/tkstart.c)调用。 进行硬件定时器的初始化。(init_hw_timer) 注册系统定时器的中断处理程序。(define_inthdr 调用) 允许定时器中断。

clear_hw_timer_interrupt
[类别] C 语言内联函数 [定义内容] 定义硬件定时器中断清除函数 clear_hw_timer_interrupt。 [定义范例] Inline void clear_hw_timer_interrupt( void ) { } [备注] 本函数被系统定时器中断处理函数 timer_handler(kernel/tkernel/src/tkstart.c)调用,进行中断清除等处 理。timer_handler 被 timer_handler_startup 函数(cpu_support.S)调用。

(67/70)

end_of_hw_timer_interrupt
[类别] C 语言内联函数 [定义内容] 定义硬件定时器中断结束函数 end_of_hw_timer_interrupt。 [定义范例] Inline void end_of_hw_timer_interrupt( void ) { } [备注] 本函数被系统定时器中断处理函数 timer_handler(kernel/tkernel/src/tkstart.c)在最后调用,预计会进行中 断清除等处理。

terminate_hw_timer
[类别] C 语言内联函数 [定义内容] 定义硬件定时器结束函数 terminate_hw_timer。 [定义范例] [1] [2] [备注] 本函数被系统定时器处理函数 timer_shutdown(kernel/tkernel/src/tkstart.c)调用。 停止硬件定时器的计时。 禁止定时器中断。

get_hw_timer_nsec
[类别] C 语言内联函数 [定义内容] 定义硬件定时器 microtime 参阅函数 get_hw_timer_nsec。 [定义范例] [1] [2] [备注] 本函数在 td_get_tim 系统调用以及 td_get_otm 系统调用中测量 microtime 时被调用。 读取硬件定时器的计时。 根据系统共享信息与计时值,以纳秒单位计算经过时间。

(68/70)

3.3

T-Monitor 的实施

使 T-Kernel 运行所需要的 T-Monitor 功能如表 3.11 所示。 表 3.11 T-Kernel 运行所必需的 T-Monitor 功能 功能概述 系统功能 调试功能 程序支持功能 必须 非必须 非必须 必要程度 实施内容 需要重置及异常、中断入口处理 需要在控制台的调试 需要实施 tm_putstring 等串行输入输出 类的监控服务函数

3.3.1 硬件初始化及系统启动处理
为了使 T-Kernel 运行需要实施如下所示的处理。 (1) (2) (3) (4) (5) (6) (7) (8) 向中断矢量表的注册 针对外部总线访问的各种设置 通用输入输出端口初始设置 CPU 时钟设置 堆栈指针设置 中断控制器的设置 系统共通信息(SystemCommonInfo 结构体)的初始化 T-Monitor 服务函数用串行 I/O 初始化

3.3.2 异常及中断入口处理
需要参阅 T-Kernel 实施规格书,创建进行异常及中断的入口处理的部分。参阅 T-Kernel 实施规格的示例 代码进行编写。

3.3.3 监控服务函数的实施
在 T-Monitor 服务函数中存在如表 3.12 所示的函数,需要实施串行输入输出作为最低限度的实施。 表 3.12 T-Monitor 服务函数实施内容 功能概述 进入监控 控制台单字符输入 控制台单字符输出 控制台单行输入 控制台字符串输出 监控命令执行 磁盘读取 磁盘写入 获取磁盘信息 系统结束 扩展服务功能 函数名称 tm_monitor( void ) tm_getchar( INT wait ) tm_putchar( INT c) tm_getline(UB *buff) tm_putstring(UB *buff) tm_command( UB *buff) tm_readdisk() tm_writedisk() tm_infodisk() tm_exit() tm_extsvc() 实施内容举例 实施(但不做任何操作) 实施(但未支持等待) 实施(但未支持 Ctrl-C 处理) 实施 实施 未实施 未实施 未实施 未实施 实施(但仅入口) 未实施

(69/70)

4 运行验证与适应化及最优化
4.1
(1)

运行检查
使用默认的程序检查引导信息 在发布版 T-Kernel 源代码中,内核初始化后启动用户堆栈,成为进行串行输入输出的规格,可以 用于初始化的检查等。 T-Engine Forum 预计要发放的测试套件 T-Engine Forum 的测试套件是以 API 验证为目的而编写的,它作为 T-Kernel 上的程序而运行,调 用系统调用与程序库函数,检查其返回值。测试结果串行输出。 其他 T-Kernel 用示例程序等 在 SH/M32R T-Engine HomePage (http://www.superh-tkernel.org/ http://www.m32r-tkernel.org/) 或 TEADEC(http://www.t-engine.com.sg/)等站点开放有 T-Kernel 专用软件,因此可以使用它们来检 查运行。

T-Kernel 的运行检查方法目前有如下方法。

(2)

(3)

4.2

适应化/最优化

从 T-Engine Forum 发放的 T-Kernel 源代码考虑了中间件流通和与上层 Extension 之间的匹配,其实施从 某种意义上说是一种参考模型。实际嵌入到产品中时,需要从内核中删除不使用的功能,或进行减少使 用内存、缩短启动时间等适应化及最优化的处理。 关于这些适应化及最优化处理,参阅 T-Engine Forum 或 TRON 项目开放的文档,或者购买第三方研发的 T-Kernel 开发包使用都可以实施。

5 参考文献及 URL
(1) (2) (3) (4) (5) (6) (7) T-Kernel 标准手册 新修订版(Personal Media 社刊) T-Kernel 嵌入式开发指南 Ver.1.00(社团法人 TRON 协会、YRP Ubiquitous Networking 研究所) T-Engine Forum(http://www.t-engine.org/) TRON PROJECT(http://www.tron.org/) TEADEC (http://www.t-engine.com.sg/) SH/M32RT-Engine HomePage (http://www.superh-tkernel.org/, http://www.m32r-tkernel.org ) TE@Onghu (http://www.onghu.com/te/)

(70/70)



T-Kernel对应新硬件的实施指南


相关文章:
更多相关标签: