当前页面为 开发中 版本,查看特定版本的文档,请在页面左下角的下拉菜单中进行选择。

PANCHIP RISC 架构简述

PANCHIP RISC架构指令固定长度为16位,数据为8位。

存储器

存储器分为4大类。

存储器名称

地址空间

描述

stack

栈区,为纯硬件栈,软件无法访问

code

0x0000 ~ 0x1fff

代码区,软件只读

data

0x00 ~ 0xff

数据区,软件可读写,支持位操作

xdata

0x0000 ~ 0xffff

扩展数据区,软件可读写,不支持位操作

stack区

栈区是有限的,例如PAN221x的栈深度为8级,一级即两个字节,因此PAN221x16字节栈区。

栈不对软件开放,仅在函数调用或中断时,内核将自动进行栈操作:

  • 函数调用:PCLPCH依次入栈;

  • 函数返回:PCHPCL依次出栈;

  • 中断进入:ACCSTATUSPCLPCH依次入栈;

  • 中断返回:PCHPCLSTATUSACC依次出栈。

可以看到每一次函数调用将会占用两字节,因此如果中断发生,当函数调用深度达到8级时,将总共占用16字节栈;如果算上中断(占用4字节),那么如果栈只有8级,则为安全起见,函数调用最大深度应保持在6级内。

注意

如果函数调用深度过大,导致栈溢出,则会引起内核错乱。

code区

code区主要用于放置程序指令,也可以放置常量数据,仅可通过movc指令进行读取。

data区

数据区,一般又细分为sfrram两个区;支持除movcmovxldxstx之外的所有数据算数指令的直接寻址访问。

同时支持使用寄存器IDATIADR进行间接寻址。

xdata区

扩展数据区,仅支持两种访问方式:

访问方式

可访问地址范围

描述

直接访问

0x0000 ~ 0x07ff

使用指令movx

间接访问

0x0000 ~ 0xffff

使用寄存器XDPLXDPH配合指令ldxstx进行

某些芯片没有该区域,也就不支持相应的指令,例如PAN221x

存储器寻址

寻址方式共4种:

寻址方式

描述

寄存器寻址

仅累加器A可进行寄存器寻址

直接寻址

data区和xdata 0x0000 ~ 0x07ff 区支持直接寻址(xdata区直接寻址使用指令movx)

间接寻址

code区间接寻址使用寄存器IAPADRLIAPADRHIAPDATH以及指令movc
data区间接寻址使用寄存器IDATIADR
xdata区间接寻址使用寄存器XDPLXDPH以及指令ldxstx

位寻址

仅data区支持位寻址

子程序过程

子程序通过call指令进行调用,通过ret指令返回。

子程序过程如下:

  1. 父程序调用子程序(call指令);

  2. PCLPCH依次入栈(硬件自动);

  3. 跳转到子程序地址进行执行(PC=子程序地址);

  4. 子程序程序执行结束,返回(ret指令);

  5. PCHPCL依次出栈(硬件自动);

  6. 跳转到父程序对应位置继续执行(PC=(PCH<<16)|PCL)。

                                call instruction
                                       |
        current instruction at ADDR--- | --- current PC is ADDR+1
                                       |
parent  |==============================||========================>
                                       ||
        push PCL--------------------- /  \ ----------pop PCL
        push PCH-------------------- /    \ ---------pop PCH
        PC=child_program_address--- /      \
                                   /        \
 child                            |=========>|
                                             |
                                      ret instruction

中断过程

PANCHIP RISC 架构中断只有一个入口地址,即是所有中断都汇集到一个入口,具体是什么中断需要软件自行判断,因此也不存在硬件中断优先级。中断入口地址一般为code区地址8

中断的过程如下:

  1. 发生中断;

  2. ACCSTATUSPCLPCH依次入栈(硬件自动);

  3. 跳转到中断入口地址执行中断服务程序(PC=中断入口地址);

  4. 中断服务程序执行结束,触发中断退出(reti指令);

  5. PCHPCLSTATUSACC依次出栈(硬件自动);

  6. 跳转到主程序发生中断处继续执行(PC=(PCH<<16)|PCL)。

                                interrupt here
                                       |
        current instruction at ADDR--- | --- current PC is ADDR+1
                                       |
  main  |==============================||========================>
                                       ||
        push ACC--------------------- /  \ ------------pop ACC
        push STATUS----------------- /    \ -----------pop STATUS
        push PCL------------------- /      \ ----------pop PCL
        push PCH------------------ /        \ ---------pop PCH
        PC=interrupt_entry------- /          \
                                 /            \
   isr                          |=============>|
                                               |
                                        reti instruction

不支持操作系统

因为栈为纯硬件栈,软件无法操作,因此不支持操作系统。