CPU设计实战 第六章(下)

访存指令的添加

一.加载指令

首先我们先对LB、LBU、LH、LHU、LWL、LWR指令的功能进行分析。
LB
在这里插入图片描述
LBU
在这里插入图片描述
LH
在这里插入图片描述
LHU
在这里插入图片描述
LWL
在这里插入图片描述
LWR
在这里插入图片描述
在这里插入图片描述
LB、LBU、LH、LHU与LW指令的差异在于从内存取回的数据位宽不同,因为数据RAM的位宽是32位的,所以这些指令访问数据RAM的地址都是用指令访存地址(data_sram_addr)去掉最低两位得到的,这四条指令在译码、执行、回写阶段的数据通路、控件逻辑可以复用LW指令的设计实现。除此之外,需要从数据RAM返回值中选取需要的内容以及将内容扩展至32位的数据通路都是要增加的,这里我们将此数据通路增加到访存阶段,数据通路的具体细节如下:
1. 从数据RAM输出结果中选取所需内容
既然数据RAM的宽度是4个字节,那么LB和LBU访问的内容可以出现在这四个字节的任一个中,LH和LHU访问的内容可以是其中的低2字节或是高2字节。也就是说,这些指令需要的数据并不总出现在数据 RAM输出数据的最低位置上。因此,我们需要引入一个多路选择器。这个选择器的选择信号是通过指令访存地址的最低两位以及访存操作的类型信息共同生成的。访存操作的类型信息是没有从译码级或执行级传递到访存级的,需要在数据通路中予以添加。
2. 将选取内容扩展至32位
LB、LBU、LH和LHU指令从数据RAM取回的数据宽度比通用寄存器的宽度要小,所以这些数据需要扩展到32位才能成为最终写入寄存器的结果。进行有符号扩展还是无符号扩展是根据指令来确定的,LB、LH是有符号扩展,LBU、LHU是无符号扩展。这里还要特别注意,由于从数据RAM输出结果中选取的内容不固定,所以进行有符号扩展时符号位也要通过访存地址的最低两位来决定。
对于非对齐加载指令LWL、LWR,需要根据访存地址最低两位的情况用从数据RAM取出的字内容的一部分与rt号寄存器的一部分原值拼接后更新rt号目的寄存器的值。其数据通路的实现方式是读取rt号目的寄存器的旧值,与待写入的新值拼接为32位的最终结果,作为写入目的寄存器的最终结果。由于rt号寄存器的值没有传递到访存阶段,所以也要添加新的数据通路。

二.存储指令的添加

共添加4条加载指令,分别为SB、SH、SWL、SWR,指令格式及功能分析如下:
SB
在这里插入图片描述
SH
在这里插入图片描述
SWL
在这里插入图片描述
SWR
在这里插入图片描述
在这里插入图片描述
存储指令与上述加载指令的实现机制类似,这里就不再分析其具体的数据通路实现了。对各个模块增加以及修改的数据通路代码如下。
ID_stage.v

wire [11:0]   mem_control;//用于标志12条访存指令的具体类型
wire        inst_lb;
wire        inst_lbu;
wire        inst_lh;
wire        inst_lhu;
wire        inst_sb;
wire        inst_sh;
wire        inst_lwl;
wire        inst_lwr;
wire        inst_swl;
wire        inst_swr;
assign inst_lb     = op_d[6'h20];
assign inst_lbu    = op_d[6'h24];
assign inst_lh     = op_d[6'h21];
assign inst_lhu    = op_d[6'h25];
assign inst_sb     = op_d[6'h28];
assign inst_sh     = op_d[6'h29];
assign inst_lwl    = op_d[6'h22];
assign inst_lwr    = op_d[6'h26];
assign inst_swl    = op_d[6'h2a];
assign inst_swr    = op_d[6'h2e];
assign mem_control = {inst_swr,inst_swl,inst_sh,inst_sb,inst_lwr,inst_lwl,
                      inst_lhu,inst_lh,inst_lbu,inst_lb,inst_sw,inst_lw};
//需要进行修改的数据通路
assign load_op = inst_lw | inst_lb | inst_lbu | inst_lh | inst_lhu | inst_lwl | inst_lwr; 
assign ds_to_es_bus = {
                       mem_control ,  //156:145
                       mf_mt       ,  //144:141
                       mult_div    ,   //140:137
                       alu_op      ,  //136:125
                       load_op     ,  //124:124
                       src1_is_sa  ,  //123:123
                       src1_is_pc  ,  //122:122
                       src2_is_imm ,  //121:120
                       src2_is_8   ,  //119:119
                       gr_we       ,  //118:118
                       mem_we      ,  //117:117
                       dest        ,  //116:112
                       imm         ,  //111:96
                       rs_value    ,  //95 :64
                       rt_value    ,  //63 :32
                       ds_pc          //31 :0
                      };
assign alu_op[ 0] = inst_addu | inst_addiu | inst_lw | inst_sw | inst_jal | 
                    inst_add | inst_addi|inst_bltzal | inst_bgezal |
                    inst_jalr | inst_lb | inst_lbu | inst_lh | inst_lhu |
                    inst_sb | inst_sh | inst_lwr | inst_lwl | inst_swl | 
                    inst_swr;
assign src2_is_imm_sign = inst_addi | inst_addiu | inst_lw | inst_sw | 
                          inst_slti | inst_sltiu | inst_lb | inst_lbu | 
                          inst_lh | inst_lhu |inst_sb | inst_sh | inst_lwl | 
                          inst_lwr | inst_swl | inst_swr;
assign inst_no_dest = inst_beq | inst_bne | inst_jr | inst_sw | inst_bgez |
                      inst_bgtz | inst_blez | inst_bltz | inst_j | inst_sb |
                      inst_sh | inst_swl | inst_swr ;                          
assign res_from_mem = inst_lw| inst_lb | inst_lbu | inst_lh | 
                      inst_lhu | inst_lwl | inst_lwr; 
assign dst_is_rt    = inst_addiu | inst_lui | inst_lw | inst_addi |
                      inst_slti | inst_sltiu | inst_andi | inst_ori | 
                      inst_xori | inst_lb | inst_lbu | inst_lh | 
                      inst_lhu | inst_lwl | inst_lwr;      
 assign gr_we        = ~inst_sw & ~inst_beq & ~inst_bne & ~inst_jr & 
                       ~inst_j & ~inst_mthi & ~inst_mtlo & ~inst_mult & 
                       ~inst_multu & ~inst_div & ~inst_divu & ~inst_bgez & 
                       ~inst_bgtz & ~inst_blez & ~inst_bltz & ~inst_swl &
                       ~inst_swr & ~inst_sb & ~inst_sh;//不需要在回写阶段将结果写回到寄存器堆的指令    
assign mem_we       = inst_sw | inst_swl | inst_swr | inst_sb | inst_sh;                                                             

EXE_stage.v

wire [11:0] es_mem_control;
wire [31:0] write_sram_data;//写数据RAM的值
wire [3:0]  sram_wen;//数据RAM字节使能信号
wire inst_is_swr;
wire inst_is_swl;
wire inst_is_sh;
wire inst_is_sb;
wire inst_is_sw;
assign inst_is_swr = es_mem_control == 12'b100000000000;
assign inst_is_swl = es_mem_control == 12'b010000000000;
assign inst_is_sh  = es_mem_control == 12'b001000000000;
assign inst_is_sb  = es_mem_control == 12'b000100000000;
assign inst_is_sw  = es_mem_control == 12'b000000000010;
assign {
        es_mem_control    ,  //156:145
        mf_mt          ,  //144:141
        mult_div       ,   //140:137
        es_alu_op      ,  //136:125
        es_load_op     ,  //124:124
        es_src1_is_sa  ,  //123:123
        es_src1_is_pc  ,  //122:122
        es_src2_is_imm ,  //121:120
        es_src2_is_8   ,  //119:119
        es_gr_we       ,  //118:118
        es_mem_we      ,  //117:117
        es_dest        ,  //116:112
        es_imm         ,  //111:96
        es_rs_value    ,  //95 :64
        es_rt_value    ,  //63 :32
        es_pc             //31 :0
       } = ds_to_es_bus_r;
assign es_to_ms_bus = {
                       es_rt_value    ,  //114:83
                       es_mem_control ,  //82:71
                       es_res_from_mem,  //70:70
                       es_gr_we       ,  //69:69
                       es_dest        ,  //68:64
                       es_result  ,  //63:32
                       es_pc             //31:0
                      };
assign write_sram_data = inst_is_sb ? (es_alu_result[1:0] == 2'b00 ? {24'd0 , es_rt_value[7:0]}:
                                       es_alu_result[1:0] == 2'b01 ? {16'd0, es_rt_value[7:0] , 8'd0}:
                                       es_alu_result[1:0] == 2'b10 ? {8'd0 , es_rt_value[7:0], 16'd0}:
                                                                     {es_rt_value[7:0] , 24'd0}
                                       ):
                          inst_is_sh ? (es_alu_result[1:0] == 2'b00 ? {16'd0,es_rt_value[15:0]}:
                                                                      {es_rt_value[15:0],16'd0}):
                         inst_is_swl ? (es_alu_result[1:0] == 2'b00 ? {24'd0 , es_rt_value[31:24]}:
                                        es_alu_result[1:0] == 2'b01 ? {16'd0 , es_rt_value[31:16]}:
                                        es_alu_result[1:0] == 2'b10 ? {8'd0  , es_rt_value[31:8] }:
                                        es_rt_value):
                         inst_is_swr ? (es_alu_result[1:0] == 2'b00 ? es_rt_value :
                                        es_alu_result[1:0] == 2'b01 ? {es_rt_value[23:0] , 8'd0}:
                                        es_alu_result[1:0] == 2'b10 ? {es_rt_value[15:0] , 16'd0}:
                                                                      {es_rt_value[7:0]  , 24'd0}):
                                                                       es_rt_value;
 assign sram_wen = inst_is_sb ? (es_alu_result[1:0] == 2'b00 ? 4'b0001:
                                 es_alu_result[1:0] == 2'b01 ? 4'b0010:
                                 es_alu_result[1:0] == 2'b10 ? 4'b0100:
                                                               4'b1000):
                   inst_is_sh ? (es_alu_result[1:0] == 2'b00 ? 4'b0011:
                                                               4'b1100):
                  inst_is_swl ? (es_alu_result[1:0] == 2'b00 ? 4'b0001:
                                 es_alu_result[1:0] == 2'b01 ? 4'b0011:
                                 es_alu_result[1:0] == 2'b10 ? 4'b0111:
                                                               4'b1111):
                  inst_is_swr ? (es_alu_result[1:0] == 2'b00 ? 4'b1111:
                                 es_alu_result[1:0] == 2'b01 ? 4'b1110:
                                 es_alu_result[1:0] == 2'b10 ? 4'b1100:
                                                               4'b1000):
                                                               4'b1111;
assign data_sram_wen   = es_mem_we&&es_valid ?  sram_wen  : 4'h0;//写回到数据寄存器
assign data_sram_addr  = {es_alu_result[31:2],2'b0};
assign data_sram_wdata = write_sram_data & {32{es_valid}};                                                               

MEM_stage.v

wire [11:0] ms_mem_control;
wire [31:0] ms_rt_value;//用于将rt寄存器的数据与访存数据的拼接用
wire [31:0] mem_result_lb;
wire [31:0] mem_result_lbu;
wire [31:0] mem_result_lh;
wire [31:0] mem_result_lhu;
wire [31:0] mem_result_lwr;
wire [31:0] mem_result_lwl;
wire  load_sign_lb;
wire  load_sign_lh;
assign load_sign_lb =  ms_alu_result[1:0] == 2'b00 ? data_sram_rdata[7] :
                       ms_alu_result[1:0] == 2'b01 ? data_sram_rdata[15]:
                       ms_alu_result[1:0] == 2'b10 ? data_sram_rdata[23]:
                                                     data_sram_rdata[31];
assign mem_result_lb[7:0] = ms_alu_result[1:0] == 2'b00 ? data_sram_rdata[7:0]  :
                            ms_alu_result[1:0] == 2'b01 ? data_sram_rdata[15:8] :
                            ms_alu_result[1:0] == 2'b10 ? data_sram_rdata[23:16]:
                                                          data_sram_rdata[31:24];
assign mem_result_lb[31:8] = {24{load_sign_lb}};
assign mem_result_lbu = {24'd0,mem_result_lb[7:0]};
assign load_sign_lh =  ms_alu_result[1:0] == 2'b00 ? data_sram_rdata[15]:
                       ms_alu_result[1:0] == 2'b10 ? data_sram_rdata[31]:
                                                     1'b0;
assign mem_result_lh[15:0] = ms_alu_result[1:0] == 2'b00 ? data_sram_rdata[15:0]:
                             ms_alu_result[1:0] == 2'b10 ? data_sram_rdata[31:16]:
                                                           16'd0;
assign mem_result_lh[31:16] = {16{load_sign_lh}};
assign mem_result_lhu = {16'd0, mem_result_lh[15:0]};
assign mem_result_lwr = ms_alu_result[1:0] == 2'b00 ? data_sram_rdata[31:0] :
                        ms_alu_result[1:0] == 2'b01 ? {ms_rt_value[31:24],data_sram_rdata[31:8]}:
                        ms_alu_result[1:0] == 2'b10 ? {ms_rt_value[31:16],data_sram_rdata[31:16]}:
                                                      {ms_rt_value[31:8] ,data_sram_rdata[31:24]};
assign mem_result_lwl = ms_alu_result[1:0] == 2'b00 ? {data_sram_rdata[7:0] ,ms_rt_value[23:0]}:
                        ms_alu_result[1:0] == 2'b01 ? {data_sram_rdata[15:0],ms_rt_value[15:0]}:
                        ms_alu_result[1:0] == 2'b10 ? {data_sram_rdata[23:0],ms_rt_value[7:0]}:
                                                       data_sram_rdata[31:0];       
assign mem_result = (ms_mem_control == 12'b000000000100) ? mem_result_lb :
                    (ms_mem_control == 12'b000000001000) ? mem_result_lbu:
                    (ms_mem_control == 12'b000000010000) ? mem_result_lh :
                    (ms_mem_control == 12'b000000100000) ? mem_result_lhu:
                    (ms_mem_control == 12'b000010000000) ? mem_result_lwr:
                    (ms_mem_control == 12'b000001000000) ? mem_result_lwl:
                                                          data_sram_rdata;
assign {
        ms_rt_value   ,   //114:83  
        ms_mem_control ,  //82:71
        ms_res_from_mem,  //70:70
        ms_gr_we       ,  //69:69
        ms_dest        ,  //68:64
        ms_alu_result  ,  //63:32 
        ms_pc             //31:0
       } = es_to_ms_bus_r;

mycpu.h

    `define DS_TO_ES_BUS_WD 157
    `define ES_TO_MS_BUS_WD 115

三.实验结果

测试点全部通过
在这里插入图片描述

  • 14
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》以飞思卡尔半导体公司(原摩托罗拉半导体部)16位S12X系列微控制器中MC9S12XS128为蓝本阐述嵌入式系统的软件与硬件设计。全书共11章,其中第1章阐述嵌入式系统的知识体系、学习误区与学习建议。第2章给出XS128硬件最小系统,并简要介绍S12XCPUCPU12X)。第3章给出第一个样例程序及CodeWai·“or工程组织,完成第一个S12X工程的入门。第4章给出基于硬件构件的嵌入式系统开发方法。第5章阐述串行通信接口SCI,并给出第一个带中断的实例。1~5章介绍了学习一个新MCU完整要素(知识点)的入门。6~12章分别介绍GPIO的应用(键盘、LED及LCD)、定时器(含PWM)、串行外设接口SPI、Flash存储器在线编程、CAN总线、A/D转换及S12XS128其他模块等。附录给出相关资料。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》涉及的实例源程序、辅助资料、相关芯片资料及常用软件工具,可在北航出版社下载中心或苏州大学飞思卡尔嵌入式系统研发中心网站下载。《嵌入式系统设计实战:基于飞思卡尔S12X微控制器》可供大学有关专业的高年级学生和研究生用作教材或参考读物,也可供嵌入式系统开发与研究人员用作参考和进修资料。 第1章 概述 1 1.1 嵌入式系统定义、由来及特点 1 1.1.1 嵌入式系统的定义 1 1.1.2 嵌入式系统的由来及其与微控制器的关系 2 1.1.3 嵌入式系统的特点 3 1.2 嵌入式系统的知识体系、学习误区及学习建议 4 1.2.1 嵌入式系统的知识体系 4 1.2.2 嵌入式系统的学习误区 5 1.2.3 基础阶段的学习建议 8 1.3 嵌入式系统常用术语 10 1.3.1 与硬件相关的术语 10 1.3.2 与通信相关的术语 11 1.3.3 与功能模块及软件相关的术语 12 1.4 嵌入式系统常用的C语言基本语法 13 第2章 S12X系列MCU硬件最小系统及CPU12X 26 2.1 S12X系列MCU概述及型号标识 26 2.1.1 S12X系列MCU概述 26 2.1.2 S12X系列MCU型号标识 28 2.2 S12X系列MCU的功能及存储器映像 29 2.2.1 S12X系列MCU的功能 30 2.2.2 S12X系列MCU的存储器映像及特点 31 2.3 XS128的引脚功能及硬件最小系统 36 2.3.1 XS128(80引脚QFP封装)的引脚功能 37 2.3.2 XS128的硬件最小系统 40 2.3.3 硬件最小系统的焊接与测试步骤 43 2.4 CPU12X的内部寄存器 44 2.5 CPU12X的寻址方式 47 2.6 CPU12X指令系统概要 51 2.6.1 数据传送类指令 53 2.6.2 算术运算类指令 56 2.6.3 逻辑运算类与位操作类指令 60 2.6.4 程序控制类指令 63 2.6.5 其他类指令 71 2.7 CPU12X汇编语言基础 72 2.7.1 S12X汇编源程序格式 72 2.7.2 S12X汇编语言伪指令 74 第3章 第一个样例程序及CodeWarrior工程组织 77 3.1 通用I/O接口基本概念及连接方法一 77 3.2 XS128的GPIO寄存器与GPIO构件封装 79 3.2.1 XS128的GPIO寄存器 79 3.2.2 GPIO的简单编程方法 83 3.3 CodeWarrior开发环境与S08/S12/ColdFire三合一写入器 84 3.3.1 CodeWarrior开发环境简介与基本使用方法 85 3.3.2 S08/S12/ColdFire三合一写入器 86 3.3.3 MC9S12XS128硬件评估板 87 3.4 CW环境C语言工程文件的组织 87 3.4.1 工程文件的逻辑组织结构 88 3.4.2 工程文件的物理组织结构 90 3.4.3 系统启动及初始化相关文件 91 3.4.4 芯片初始化、主程序、中断程序及其他文件 98 3.4.5 机器码文件(s19文件)的简明解释 101 3.4.6 lst文件与map文件 103 3.4.7 如何在CW环境下新建一个S12工程 105 3.5 第一个C语言工程:控制小灯闪烁 105 3.5.1 GPIO构件设计 106 3.5.2 Light构件设计 113 3.5.3 Light测试工程主程序 115 3.5.4 理解第一个C工程的执行过程 116 3.6 第一个汇编语言工程:控制小灯闪烁 117 3.6.1 汇编工程文件的组织 118 3.6.2 Light构件汇编程序 122 3.6.3 Light测试工程主程序 124 3.6.4 理解第一个汇编工程的执行过程 126 第4章 基于硬件构件的嵌入式系统开发方法 129 4.1 嵌入式系统开发所遇到的若干问题 129 4.2 嵌入式硬件构件的基本思想与应用方法 130 4.3 基于硬件构件的嵌入式系统硬件电路设计 131 4.3.1 设计时需要考虑的基本问题 131 4.3.2 硬件构件化电路原理图绘制的简明规则 133 4.3.3 实验PCB板设计的简明规则 135 4.4 基于硬件构件的嵌入式底层软件构件的编程方法 139 4.4.1 嵌入式硬件构件和软件构件的层次模型 139 4.4.2 底层构件的实现方法与编程思想 140 4.4.3 硬件构件及底层软件构件的重用与移植方法 141 第5章 串行通信接口SCI 144 5.1 异步串行通信的通用基础知识 144 5.1.1 串行通信的基本概念 145 5.1.2 RS-232总线标准 146 5.1.3 TTL电平到RS-232电平转换电路 148 5.1.4 串行通信编程模型 149 5.2 SCI模块的编程寄存器 150 5.3 SCI编程实例 155 5.3.1 SCI初始化与收发编程的基本方法 156 5.3.2 SCI构件设计与测试实例 157 5.4 XS128的中断源与第一个带有中断的编程实例 166 5.4.1 中断与异常的通用知识 166 5.4.2 XS128的中断机制 166 5.4.3 XS128的中断编程方法 171 5.4.4 XS128的中断优先级编程实例 173 第6章 GPIO的应用实例:键盘、LED与LCD 175 6.1 键盘技术概述 175 6.1.1 键盘模型及接口 175 6.1.2 键盘编程的基本问题 177 6.1.3 键盘构件设计与测试实例 178 6.2 LED技术概述 184 6.2.1 扫描法LED显示编程原理 184 6.2.2 LED构件设计与测试实例 186 6.3 LCD技术概述 191 6.3.1 LCD的特点和分类 191 6.3.2 点阵字符型液晶显示模块 193 6.3.3 HD44780 193 6.3.4 LCD构件设计与测试实例 199 第7章 定时器相关模块 207 7.1 计数/定时器的基本工作原理 207 7.2 定时器模块的基本编程方法与实例 208 7.2.1 定时器模块计时功能的基本寄存器 210 7.2.2 定时器构件设计与测试实例 212 7.3 定时器模块输入捕捉功能的编程方法与实例 216 7.3.1 输入捕捉的基本含义 216 7.3.2 输入捕捉的寄存器 217 7.3.3 输入捕捉构件设计与测试实例 218 7.4 定时器模块输出比较功能的编程方法与实例 221 7.4.1 输出比较的基本知识 222 7.4.2 用于输出比较功能的相关寄存器 222 7.4.3 输出比较构件设计与测试实例 224 7.5 定时器模块脉冲累加功能的编程方法与实例 226 7.5.1 脉冲累加的基本知识 226 7.5.2 脉冲累加功能的相关寄存器 227 7.5.3 脉冲累加器构件设计 228 7.6 脉宽调制模块 231 7.6.1 PWM工作原理 231 7.6.2 XS128的PWM的特点及模块框图 232 7.6.3 脉宽调制模块PWM相关寄存器 233 7.6.4 PWM构件设计及测试实例 236 7.7 周期中断定时器模块PIT 243 7.7.1 PIT模块功能描述 243 7.7.2 PIT模块的编程寄存器 245 7.7.3 PIT构件设计与测试实例 248 第8章 A/D与SPI 252 8.1 A/D通用知识 252 8.1.1 A/D的基本问题 252 8.1.2 A/D转换器 253 8.1.3 A/D转换常用传感器简介 254 8.1.4 电阻型传感器采样电路设计 255 8.2 A/D模块的编程寄存器 257 8.3 A/D模块编程方法与实例 264 8.3.1 A/D模块基本编程方法 264 8.3.2 A/D构件设计与测试实例 265 8.4 SPI的基本工作原理 270 8.4.1 SPI基本概念 270 8.4.2 SPI的数据传输 272 8.4.3 SPI模块的时序 272 8.4.4 模拟SPI 276 8.5 SPI模块的编程寄存器 276 8.6 SPI构件设计与测试实例 282 第9章 Flash存储器在线编程 289 9.1 S12X系列MCU的Flash存储器的特点及分页机制 289 9.1.1 S12X系列MCU的Flash存储器的特点 290 9.1.2 XS128的Flash存储器分页机制 290 9.2 Flash存储器编程方法 295 9.2.1 Flash存储器编程的基本概念 295 9.2.2 Flash存储器的编程寄存器 296 9.2.3 FCCOB-NVM命令模式 300 9.2.4 Flash存储器的编程步骤 301 9.3 D-Flash在线编程 303 9.4 P-Flash在线编程 308 9.5 Flash存储器的保护特性和安全性 313 9.5.1 Flash存储器的配置区域 313 9.5.2 Flash存储器的保护特性 314 9.5.3 Flash存储器的安全性 317 第10章 CAN总线 321 10.1 CAN总线通用知识 321 10.1.1 CAN总线协议的历史概况 321 10.1.2 CAN硬件系统的典型电路 321 10.1.3 CAN总线的有关基本概念 324 10.1.4 帧结构 327 10.1.5 位时间 331 10.2 MSCAN模块简介 332 10.2.1 MSCAN特性 333 10.2.2 报文存储结构、标识符验收过滤与时钟系统 334 10.2.3 CAN模块的主要运行模式、低功耗选项、中断与响应 341 10.3 MSCAN模块的内存映射及寄存器定义 345 10.3.1 MSCAN模块内存映射 345 10.3.2 MSCAN模块寄存器 346 10.4 MSCAN模块双机通信测试实例 360 10.4.1 测试模型 360 10.4.2 编程要点 360 10.4.3 CAN模块底层构件设计 361 10.4.4 测试操作要点 374 10.5 MSCAN模块的自环通信实例 374 10.5.1 测试模型 374 10.5.2 编程要点及设计代码 374 第11章 系统时钟与其他功能模块 378 11.1 时钟与复位产生模块概述 378 11.1.1 锁相环技术 378 11.1.2 CRG模块框图 380 11.1.3 CRG模块的工作模式 381 11.1.4 XS128内部锁相环结构 383 11.2 XS128的CRG模块的初始化 384 11.2.1 XS128的CRG模块寄存器 384 11.2.2 初始化编程方法与实例 389 11.3 CRG模块的其他功能 392 11.3.1 CRG产生复位信号 392 11.3.2 中断 397 11.4 XS128的IRQ、XIRQ引脚、RTIBRK及SWI中断 398 11.4.1 IRQ与XIRQ引脚中断 398 11.4.2 实时中断 398 11.4.3 调试模块DBG与软件中断SWI指令 399 附录A XS128的映像寄存器 400 附录B S08/S12/ColdFireBDM简明使用方法 410 附录C 常见实践问题集锦 414 附录D XS128的C语言函数库 417 附录E XS128的中断源与中断向量表 421 参考文献 424
实战Nginx:取代Apache的高性能Web服务器 作者: 张宴 出版社: 电子工业出版社 出版年: 2010年2月 内容简介   Nginx (“engine x”) 是俄罗斯人Igor Sysoev编写的一款高性能HTTP 和反向代理服务器。Nginx选择了epoll和kqueue作为网络I/O模型,在高连接并发的情况下,Nginx是Apache服务器不错的替代品,它能够支持高达50 000个并发连接数的响应,运行稳定,且内存、CPU等系统资源消耗非常低。   本书主要分为4个部分,第1部分为基础篇,介绍了Nginx服务器的安装与配置方法;第2部分为进阶篇,重点介绍了Nginx的配置优化方法、Nginx与PHP/Ruby/Python/JSP/Perl/Memcached的结合配置方法、Nginx HTTP反向代理与负载均衡的配置与优化、Nginx模块开发等,最后还分析了新浪的开源软件项目──基于Nginx的NCache网页缓存系统;第3部分为实战篇,分析了Nginx在国内知名网站(如新浪播客、搜狐博客等)中的应用案例;第4部分为模块篇,对Nginx的基本模块和第三方模块进行了集中介绍。   本书是为对配置管理Nginx服务器感兴趣的读者准备的,适用于以前没有接触过Nginx,或者对Nginx有一些了解并希望能够进一步深入学习的专业系统工程师、个人网站站长及Linux/Unix从业人员。   作者简介   张宴,就职于北京金山软件公司,金山游戏官方网站──逍遥网(xoyo.com)系统架构师,技术支持部平台组组长。曾在新浪网、赶集网等公司任系统工程师、系统架构师,工作内容主要涉及:服务器系统架构设计与部署、系统运维与调优、网络故障解决、网站后端以及接口类PHP程序开发、Unix开源软件二次开发、服务器监控系统开发、系统运维与平台研发团队管理。 第1章 Nginx简介.pdf 第2章 Nginx服务器的安装与配置.pdf 第3章 Nginx的基本配置与优化.pdf 第4章 Nginx与PHP(FastCGI)的安装、配置与优化.pdf 第5章 Nginx与JSP、ASP.NET、Perl的安装与配置.pdf 第6章 Nginx HTTP负载均衡和反向代理的配置与优化.pdf 第7章 Nginx的Rewrite规则与实例.pdf 第8章 Nginx模块开发.pdf 第9章 Nginx的Web缓存服务与新浪网的开源NCACHE模块.pdf 第10章 Nginx在国内知名网站中的应用案例.pdf 第11章 Nginx的非典型应用实例.pdf 第12章 Nginx的核心模块.pdf 第13章 Nginx的标准HTTP模块.pdf 第14章 Nginx的其他HTTP模块.pdf 第15章 Nginx的邮件模块.pdf

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值