HyperSharp.NET

拈万物化阴阳之数是为吾道。

0%

坎巴拉太空计划(Kerbal Space Program、KSP)是由Squad开发的一款使用Unity3D引擎,拥有极高自由度的沙盒风格航空航天模拟游戏。于2015年4月27日开始发行。在这里玩家可以在一个“平行世界”里扮演坎巴拉航空航天工作者,设计、建造和发射自己的火箭、航天飞机以及亚轨道飞行器,将航天器送入轨道,并探索整个Kerbol系。

《坎巴拉太空计划》中,将由你来主导外星种族“坎巴拉人”的太空计划。你可以使用各式各样的部件,来根据现实中的空气动力学和轨道物理学原理组装能够飞行(或坠毁)的全功能航天器。把你的坎巴拉人乘员送入轨道及太空中(并保证他们存活下来),让他们去探索坎巴拉太阳系中的各个卫星和行星。建造基地和空间站,以拓展探险范围。

《坎巴拉太空计划》有三种游戏模式。在“科研模式”中,进行太空实验来解锁新型科技,并提升坎巴拉人的知识水平。在“生涯模式”中,管理太空计划的所有细节,包括建造、策略、资金、升级等等。在“沙盒模式”中,尽情使用游戏所提供的所有部件与科技,打造你能想象到的或者让你意想不到的各种航天器。

按键

设计模式

  • WASD 键:部件左右上下旋转
  • QE 键:控制部件平移旋转
  • 按住Shitft键可以进行微调旋转或移动全部链接部件(滚动鼠标放大缩小)
  • X键:切换摆放数量
  • C键:切换对齐方式
  • +-键:放大或缩小

火箭控制部分

  • Q E 滚转
  • A D 偏航
  • W S 俯仰
  • Alt+L 锁定分级
  • U
  • G 传动装置开关
  • B 着陆脚放下/收起
  • T SAS(火箭稳定装置)开关
  • Shift键 加大油门
  • Control键 减小油门

时间控制

  • 键盘键:<>或者点按屏幕上图标:
  • 每增加一个三角即翻倍。

发射控制

  • Space:下一级操作开启(但火箭正确分级后在火箭分级控制栏上有多个图标表示,此时每按一个控制,进行一次分级栏对应位置的操作开启。)
  • ALT + L:锁定分级栏操作以防止误操作。

存储与读取

  • F5:快速存储。
  • F9:快速读取。

视角操作

  • 鼠标滚轮(相当于“—”、“+”键):放大缩小(注:在火箭设计界面为上升/下降)
  • V键:宇航员间切换
  • C键:火箭视角与舱内视角间切换
  • [和“”键:多个飞船间切换(注:要两船相隔较近、几千米以内)
  • M键:火箭视角与轨道视角间切换
  • Tab键:聚焦于轨道视角,并选中所有天体,激活飞行中的飞船。(疑似有误,自测)

RCS控制

(模式1下):此模式下飞船姿态控制仍用W、A、S、D、Q、E

  • R键:RCS激活开关
  • H键:前进
  • N键:后退
  • I键:上移
  • K键:下移
  • J键:左移
  • L键:右移

(模式2下):此模式下单机空格可换回飞船姿态控制,即单机空格后:W、A、S、D、Q、E控制飞船姿态

  • W键:上移
  • A键:左移
  • S键:下移
  • D键:右移
  • Shift键:前进
  • Ctrl键:后退

EVA宇航员舱外活动控制

  • 空格键:脱离火箭本体、跳跃
  • R键:开启/关闭RCS
  • Shift:上移(陆地上时为跑步前进)
  • Ctrl:下移
  • WASD:上左下右移动
  • L键:打开前灯
  • Alt:切换至行动面(固定视角)
  • F键:抓取物体或登陆火箭梯级,入舱操作

导航仪

图标 名称 描述
黄线 水平标志 指示飞行器目前的朝向。导航仪绕水平标志的下方点随飞行器本身一同旋转
绿圈 顺行方向 顺行方向点火推进可以加速
绿叉 逆行方向 逆行方向点火推进可以减速
紫圈 目标方向 指向目标,随着目标移动而移动
紫叉 目标反方向 指向目标的反方向,随着目标移动而移动
蓝角 机动标志 如在轨道地图上选定了某机动,机动标志会标识相应的发动机点火方向

变轨动作

图标 名称 描述
绿圈 顺行 增加速度,增加轨道高度
绿叉 逆行 减少速度,降低轨道高度
紫角内 正规 更改轨道平面倾角
紫角外 反正规 更改轨道平面倾角
蓝内圈 径向 更改轨道左右角度
蓝圈外 反径向 更改轨道左右角度

虽然在 WPF 中也集成了 3D 呈现的功能,在简单的 3D 应用中,有时候并不需要真实光影的 3D 场景。毕竟使用 3D 引擎会消耗很多资源,有时候使用各种变换和假的阴影贴图也能设计出既省资源,又有很好用户体验的“伪”3D 界面。

在 Silverlight 中,因为性能问题,一般并不使用真 3D 引擎,微软为 Silverlight 提供了 System.Windows.Media.PlaneProjection 类,用投影变换来模拟 3D 的效果。

下面让我们看下一个 Microsoft Expression Blend 4 提供的示例 Wall3D (位于帮助>欢迎屏幕>示例)。

img

大家不要被这个可以流畅滚动的 3D 图片墙所迷惑,其实这只是一个 ListBox 控件。MainPage 中给 ListBox 定义了一个 ItemsPanelTemplate,使用新的控件来作为 ListBox 中 Items 的布局控件,这个控件就是这个项目最核心的类:CircularPanel3D。

CircularPanel3D 类继承自 System.Windows.Controls.Panel,它实现了一种新的布局方式,效果大家在上一张图片中都看到了。这种华丽的效果实际上都是由这个最重要的类中的最重要的方法: private void Refresh() 完成的。

private void Refresh()
{
    //几个计数器,看名字就功能很明了
    int count = 0;
    int col = 0;
    int row = 0;
    int zLevel = 0;

    //开始遍历子元素
    foreach (FrameworkElement childElement in this.Children)
    {
        //AngleItem是指单个元素的旋转角度,算法是360除以列数
        //这个方法的布局方式是先布满一圈,再下一环的,角度总是可以取模的
        //所以这边直接AngleItem和count相乘了
        //InitialAngle这个属性是用来确定整个圆环的偏转角度的,每次这个依赖属性变化就会重新计算布局(调用这个方法)
        double angle = (this.AngleItem * count++) - this.InitialAngle;
        //下面两个变量用来确定元素在屏幕上的位置,用到了三角函数,数学不好的请问高中数学老师
        double x = this.Radius * Math.Cos(Math.PI * angle / 180);
        double z = this.Radius * Math.Sin(Math.PI * angle / 180);
        //创建个PlaneProjection对象,并赋值
        PlaneProjection projection = new PlaneProjection();
        if (projection != null)
        {
            projection.CenterOfRotationX = 0.5;
            projection.CenterOfRotationY = 0.5;
            projection.CenterOfRotationZ = 0.5;
            projection.RotationY = angle + 90;
            projection.GlobalOffsetX = x;
            //Distance实际上就是模拟的镜头距离
            projection.GlobalOffsetZ = z - this.Distance;
            //-330。。。坑爹的硬编码,实际上就是两行元素的间距,OffsetY是纵向的偏移量,用于调整环在屏幕上的位置
            projection.GlobalOffsetY = row * (-330) + this.OffsetY;
        }
        //实际上是让double数变成int数,但是又不会丧失区别性,下面要用到
        int depth = (int)(z * 100);

        double pDist = (this.Distance - 1000) / 2000;
        double pZ = ((z + 1000) / 2000) + 0.5;

        //让太远的和太近的变透明
        double opacity = (pZ - pDist) + 0.4;
        if (opacity >= 1)
        {
            childElement.Opacity = (2 - opacity);
        }
        else if (opacity < 0)
        {
            childElement.Opacity = 0;
        }
        else
        {
            childElement.Opacity = opacity;
        }

        // 嗯这边有原版的英文注释,不解释
        // Variable zLevel changes value of ZIndex for each item in the ListBox.
        // This way the reflex of elements at the top will be placed behind the item below it.
        Canvas.SetZIndex(childElement, depth - (++zLevel * 10));

        //根据Align属性设置对齐方式,不是很重要
        double alignX = 0;
        double alignY = 0;
        switch (this.Align)
        {
            case AlignmentOptions.Left:
                alignX = 0;
                alignY = 0;
                break;
            case AlignmentOptions.Center:
                alignX = childElement.DesiredSize.Width / 2;
                alignY = childElement.DesiredSize.Height / 2;
                break;
            case AlignmentOptions.Right:
                alignX = childElement.DesiredSize.Width;
                alignY = childElement.DesiredSize.Height;
                break;
        }
        //将PlaneProjection对象赋给子元素的Projection属性
        childElement.Projection = projection;
        //定位子元素
        childElement.Arrange(new Rect(this.Width / 2 - alignX, this.Height / 2 - alignY, childElement.DesiredSize.Width, childElement.DesiredSize.Height));

        //换行,又见坑爹的硬编码14。。这个代表有十四列
        col++;
        if (col > 14)
        {
            col = 0;
            row++;
        }
    }
}

3ds 文件是 3D Max 的一种二进制存储格式,用来存储 3D 模型场景。关于这种格式官方的资料很少,从二进制角度解析文件很困难,幸好有个开源的项目lib3ds已经提供了解析的库。

  • 用 ANSI-C 编写
  • 支持的框架:
    • GNU build tools (autoconf, automake, libtool)
    • UNIX
    • Mac OS X
    • Microsoft Visual C++ 8.0
  • 支持小端和大端字节序的 cpu
  • 载入和保存:
    • Atmosphere settings
    • 背景设置 (Background settings)
    • 阴影贴图设置 (Shadow map settings)
    • 视口设置 (Viewport setting)
    • 材质 (Materials)
    • 摄像机 (Cameras)
    • 灯光 (Lights)
    • 网格 (Meshes)
    • 层次结构 (Hierarchy)
    • 关键祯 (Keyframes)
  • 计算动画(关键祯)数据
  • 简单容易操作的数据结构
    • 矢量数学模块
    • 四元数数学模块
  • 矩阵数学模块
  • 与 OpenGL 无缝集成

(1) 坐标系

在 3ds 文件中使用的坐标系是左手坐标系,从左到右,x 递增;从下到上,z 递增;从近到远,y 递增。

在 lib3ds 库中,经过解析,把 3ds 文件中的数据转换成了 OpenGL 采用的右手坐标系,从左到右,x 递增,从下到上 y 递增,从远到近,z 递增。

img

(2) 数学模块

// 矢量数学函数
extern LIB3DSAPI void lib3ds_vector_make(
    float c[3],
    float x,
    float y,
    float z);

/**
    Sets all components of a vector to zero.
    \param c
        The Pointer to the vector.
*/
extern LIB3DSAPI void lib3ds_vector_zero(
    float c[3]);

/**
    Copies all components of a vector to another vector.
    \param dst
        [out] The destination vector.
    \param src
        [in] The source vector.
*/
extern LIB3DSAPI void lib3ds_vector_copy(
    float dst[3],
    float src[3]);

/**
    Negates all components of a vector.
    \param c
        The Pointer to the vector.
*/
extern LIB3DSAPI void lib3ds_vector_neg(
    float c[3]);

extern LIB3DSAPI void lib3ds_vector_make(float c[3], float x, float y, float z);
extern LIB3DSAPI void lib3ds_vector_zero(float c[3]);
extern LIB3DSAPI void lib3ds_vector_add(float c[3], float a[3], float b[3]);
extern LIB3DSAPI void lib3ds_vector_sub(float c[3], float a[3], float b[3]);
extern LIB3DSAPI void lib3ds_vector_scalar_mul(float c[3], float a[3], float k);
extern LIB3DSAPI void lib3ds_vector_cross(float c[3], float a[3], float b[3]);
extern LIB3DSAPI float lib3ds_vector_dot(float a[3], float b[3]);
extern LIB3DSAPI float lib3ds_vector_length(float c[3]);
extern LIB3DSAPI void lib3ds_vector_normalize(float c[3]);
extern LIB3DSAPI void lib3ds_vector_normal(float n[3], float a[3], float b[3], float c[3]);
extern LIB3DSAPI void lib3ds_vector_min(float c[3], float a[3]);
extern LIB3DSAPI void lib3ds_vector_max(float c[3], float a[3]);
extern LIB3DSAPI void lib3ds_vector_transform(float c[3], float m[4][4], float a[3]);

extern LIB3DSAPI void lib3ds_quat_identity(float c[4]);
extern LIB3DSAPI void lib3ds_quat_copy(float dest[4], float src[4]);
extern LIB3DSAPI void lib3ds_quat_axis_angle(float c[4], float axis[3], float angle);
extern LIB3DSAPI void lib3ds_quat_neg(float c[4]);
extern LIB3DSAPI void lib3ds_quat_cnj(float c[4]);
extern LIB3DSAPI void lib3ds_quat_mul(float c[4], float a[4], float b[4]);
extern LIB3DSAPI void lib3ds_quat_scalar(float c[4], float k);
extern LIB3DSAPI void lib3ds_quat_normalize(float c[4]);
extern LIB3DSAPI void lib3ds_quat_inv(float c[4]);
extern LIB3DSAPI float lib3ds_quat_dot(float a[4], float b[4]);
extern LIB3DSAPI float lib3ds_quat_norm(float c[4]);
extern LIB3DSAPI void lib3ds_quat_ln(float c[4]);
extern LIB3DSAPI void lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]);
extern LIB3DSAPI void lib3ds_quat_exp(float c[4]);
extern LIB3DSAPI void lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t);
extern LIB3DSAPI void lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t);
extern LIB3DSAPI void lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]);
// 四元数数学函数
extern LIB3DSAPI void lib3ds_quat_identity(float c[4]);
extern LIB3DSAPI void lib3ds_quat_copy(float dest[4], float src[4]);
extern LIB3DSAPI void lib3ds_quat_axis_angle(float c[4], float axis[3], float angle);
extern LIB3DSAPI void lib3ds_quat_neg(float c[4]);
extern LIB3DSAPI void lib3ds_quat_cnj(float c[4]);
extern LIB3DSAPI void lib3ds_quat_mul(float c[4], float a[4], float b[4]);
extern LIB3DSAPI void lib3ds_quat_scalar(float c[4], float k);
extern LIB3DSAPI void lib3ds_quat_normalize(float c[4]);
extern LIB3DSAPI void lib3ds_quat_inv(float c[4]);
extern LIB3DSAPI float lib3ds_quat_dot(float a[4], float b[4]);
extern LIB3DSAPI float lib3ds_quat_norm(float c[4]);
extern LIB3DSAPI void lib3ds_quat_ln(float c[4]);
extern LIB3DSAPI void lib3ds_quat_ln_dif(float c[4], float a[4], float b[4]);
extern LIB3DSAPI void lib3ds_quat_exp(float c[4]);
extern LIB3DSAPI void lib3ds_quat_slerp(float c[4], float a[4], float b[4], float t);
extern LIB3DSAPI void lib3ds_quat_squad(float c[4], float a[4], float p[4], float q[4], float b[4], float t);
extern LIB3DSAPI void lib3ds_quat_tangent(float c[4], float p[4], float q[4], float n[4]);
// 矩阵数学函数
extern LIB3DSAPI void lib3ds_matrix_zero(float m[4][4]);
extern LIB3DSAPI void lib3ds_matrix_identity(float  m[4][4]);
extern LIB3DSAPI void lib3ds_matrix_copy(float dest[4][4], float src[4][4]);
extern LIB3DSAPI void lib3ds_matrix_neg(float m[4][4]);
extern LIB3DSAPI void lib3ds_matrix_transpose(float m[4][4]);
extern LIB3DSAPI void lib3ds_matrix_add(float m[4][4], float a[4][4], float b[4][4]);
extern LIB3DSAPI void lib3ds_matrix_sub(float m[4][4], float a[4][4], float b[4][4]);
extern LIB3DSAPI void lib3ds_matrix_mult(float m[4][4], float a[4][4], float b[4][4]);
extern LIB3DSAPI void lib3ds_matrix_scalar(float m[4][4], float k);
extern LIB3DSAPI float lib3ds_matrix_det(float m[4][4]);
extern LIB3DSAPI int lib3ds_matrix_inv(float m[4][4]);
extern LIB3DSAPI void lib3ds_matrix_translate(float m[4][4], float x, float y, float z);
extern LIB3DSAPI void lib3ds_matrix_scale(float m[4][4], float x, float y, float z);
extern LIB3DSAPI void lib3ds_matrix_rotate_quat(float m[4][4], float q[4]);
extern LIB3DSAPI void lib3ds_matrix_rotate(float m[4][4], float angle, float ax, float ay, float az);
extern LIB3DSAPI void lib3ds_matrix_camera(float m[4][4], float pos[3], float tgt[3], float roll);

关于 3D 数学基础知识,大家可以参考下这本书—《3D 数学基础:图形与游戏开发》。

(3) 3DS 文件数据结构

// Lib3dsFile
typedef struct Lib3dsFile {
    unsigned            user_id;
    void*               user_ptr;
    unsigned            mesh_version;
    unsigned            keyf_revision;
    char                name[12+1];
    float               master_scale;
    float               construction_plane[3];
    float               ambient[3];
    Lib3dsShadow        shadow;
    Lib3dsBackground    background;
    Lib3dsAtmosphere    atmosphere;
    Lib3dsViewport      viewport;
    Lib3dsViewport      viewport_keyf;
    int                 frames;
    int                 segment_from;
    int                 segment_to;
    int                 current_frame;
    int                 materials_size;
    int                 nmaterials;
    Lib3dsMaterial**    materials;
    int                 cameras_size;
    int                 ncameras;
    Lib3dsCamera**      cameras;
    int                 lights_size;
    int                 nlights;
    Lib3dsLight**       lights;
    int                 meshes_size;
    int                 nmeshes;
    Lib3dsMesh**        meshes;
    Lib3dsNode*         nodes;
} Lib3dsFile;

extern LIB3DSAPI Lib3dsFile* lib3ds_file_open(const char *filename);
extern LIB3DSAPI int lib3ds_file_save(Lib3dsFile *file, const char *filename);
extern LIB3DSAPI Lib3dsFile* lib3ds_file_new();
extern LIB3DSAPI void lib3ds_file_free(Lib3dsFile *file);

通过 lib3ds_file_open 函数打开 3ds 文件后,Lib3dsFile 结构包含了解析完成的所有 3d 数据。

1、PS1 文件

一个 PowerShell 脚本其实就是一个简单的文本文件,这个文件包含了一系列 PowerShell 命令,每个命令显示为独立的一行,对于被视为 PowerShell 脚本的文本文件,它的文件名需要使用.PS1 扩展。

2、执行权限

为防止恶意脚本的执行,PowerShell 有一个执行策略,默认情况下,这个执行策略被设为受限的(Restricted),意味着 PowerShell 脚本无法执行,你可以使用下面的 cmdlet 命令确定当前的执行策略:

Get-ExecutionPolicy

你可以选择使用的执行策略有:

  • Restricted – 脚本不能运行。
  • RemoteSigned – 本地创建的脚本可以运行,但从网上下载的脚本不能运行(除非它们拥有由受信任的发布者签署的数字签名)。
  • AllSigned – 仅当脚本由受信任的发布者签名才能运行。
  • Unrestricted – 脚本执行不受限制,不管来自哪里,也不管它们是否有签名。

你可以使用下面的 cmdlet 命令设置 PowerShell 的执行策略:

Set-ExecutionPolicy

3、运行脚本

如果你想从命令行运行一个可执行文件,多年来一个永恒不变的方法是,在命令行转到该执行文件所在的位置,然后键入该执行文件的名称,但这个古老的方法现在却不能适用于 PowerShell 可执行脚本了。

如果你想执行一个 PowerShell 脚本,通常必须键入完整的路径和文件名,例如,假设你要运行一个名为 SCRIPT.PS1 的脚本,你可以键入:

C:\Scripts\Script.ps1 最大的例外是,如果 PowerShell 脚本文件刚好位于你的系统目录中,那么你可以直接在命令提示符后键入脚本文件名即可运行,如:

.\Script.ps1 注意前面需要加上.\,这和 Linux 下执行 Shell 脚本的方法如出一辙。

4、管道

管道的作用是将一个命令的输出作为另一个命令的输入,两个命令(或 cmdlet)之间只需要用管道符号(|)连接即可。

为了帮助你了解管道是如何工作的,我们以一个例子进行说明,假设你想创建运行在服务器上的进程列表,并按进程的 ID 号进行排序,可以使用 Get-Process cmdlet 命令获得进程列表,但默认情况下列表不会排序,如果将这个 cmdlet 命令的输出用管道输送给 Sort-Object ID 命令,进程列表将会按进程 ID 号进行排序,如:

Get-Process | Sort-Object ID

5、变量

虽然可以使用管道将一个命令的输出输送给另一个命令,但管道本身也是有限制的,当你用管道从一个命令向另一个命令传递输出结果时,输出结果立即被使用,但有时候,你可能需要保存输出结果一段时间,以便以后可以使用(或重用),这个时候管道就应该下场,轮到变量上场了。

人们很容易将变量想象成一个仓库,但在 PowerShell 中,变量可以保存命令的完整输出,例如,假设你想保存服务器处于运行中的进程列表,你可以将它赋给一个变量,如:

$a = Get-Process

在这里,变量被命名为$a,如果你想使用这个变量,只需要简单地调用它的名称即可,例如,键入$a 便可在屏幕上打印变量的内容。

你可以将多个用管道连接的命令的最终输出赋给一个变量,只需要用一对小括号将命令括起来即可,例如,假设你想按进程 ID 对运行中的进程进行排序,然后将结果输出给一个变量,你可以使用下面这个命令:

$a = (Get-Process | Sort-Object ID)

6、@符号

通过使用@符号,你可以将列表内容转换成一个数组,例如,下面的代码创建了一个名为$Procs 的变量,它包含多行文本内容(一个数组):

$procs = @{name="explorer","svchost"}

使用变量时你也可以使用@符号,为了确保它作为数组而不是单个值处理,例如,下面的代码将在我前面定义的变量上运行 Get-Process cmdlet 命令:

Get-Process @procs

Windows 将显示 Windows 资源管理器和 Svchost 使用的所有进程,注意变量前使用的@符号,而不是常见的$符号。

7、Split

Split 操作符根据你指定的字符拆分一个文本字符串,例如,假设你想将一个句子拆分成一个单词组成的一个数组,你可以使用下面的命令做到:

"This is a test" -split " "

拆分后的结果如下:

This is a test8、Join

就像 Split 可以将一个文本字符串拆分成多块一样,Join 的操作则是逆向的,将多个独立的块连接成一个整体,例如,下面这行代码将会创建一个文本字符串,由我的名字和姓氏组成:

"Brien","Posey" -join " "

命令末尾双引号之间的空格告诉 Windows 在两个文本字符串之间插入一个空格。

8、Join

就像 Split 可以将一个文本字符串拆分成多块一样,Join 的操作则是逆向的,将多个独立的块连接成一个整体,例如,下面这行代码将会创建一个文本字符串,由我的名字和姓氏组成:

"Brien","Posey" -join " "

命令末尾双引号之间的空格告诉 Windows 在两个文本字符串之间插入一个空格。

9、断点

运行一个新创建的 PowerShell 脚本时,如果脚本有 Bug,会遇到意想不到的后果,保护自己的一个方法是在脚本的关键位置插入断点,这样你就可以确保脚本正常运行先,然后再处理可能存在的问题。

插入断点最简单的方法是根据行号插入,例如,假设你要在第 10 行插入一个断点,可以使用下面的命令:

New-PSBreakpoint -Script C:\Scripts\Script.ps1 -Line 10

你也可以将断点绑定到变量上,如果你希望你的脚本任何时候都可以修改 a$的内容,可以使用下面的命令:

New-PSBreakpoint -Script C:\scripts\Script.ps1 -variables a

注意,我在变量名后并没有包括美元符号。

可以和 PSBreakpoint 一起使用的动词包括 New,Get,Enable,Disable 和 Remove。

10、Step

调试一个脚本时,有时可能需要逐行运行脚本,这时你可以使用 Step-Into cmdlet 命令,它会使脚本一行一行地执行,不管有没有设置断点,如果你想从这种步进式运行模式退出来,使用 Step-Out cmdlet 命令即可,但需要注意的是,使用 Step-Out cmdlet 命令后,断点仍然有效。

顺便说一句,如果你的脚本使用了函数,你可能对 Step-Out cmdlet 更感兴趣,Step-Out 的工作方式和 Step-Into 一样,不过,如果调用了一个函数,Windows 不会逐步执行,整个函数将会一次性执行。

原文地址

前段时间在淘宝买了一套 USBEE AX 逻辑分析仪BUS_PIRATE总线模拟器,电路程序都是美国的,国内制版焊接的山寨板子,在淘宝可以搜索到。

USBEE AX 逻辑分析仪是基于 PC 的高性价比的电路分析调试工具,可以进行多种协议的解析和内置一个模拟示波器。基本参数如下:

逻辑分析仪

  • 数字通道8通道输入
  • 数字通道 DCH1 – 8,TRG和CLK等的电压范围为 -0.5 to 5.25V;
  • 最大采样率24M,采样深度取决于计算机内存大小
  • 内置:数据记录仪、双路电压表、双路模拟示波器、8路频率计、数字远程控制器、PWM控制器、频率发生器、I2C控制器、脉冲/边沿计数器、SPI接口解析。

模拟示波器

  • 模拟输入 2
  • 模拟通道 1
  • 最大采样速度 16Msps
  • 模拟带宽 3MHz
  • 输入电压范围 -10V ~ +10V
  • 模拟灵敏度 78mV
  • 模拟的分辨率 256分度
  • 存储深度 >1M

总线模拟器

在单片机系统开发调试过程中,常常遇到单片机和周围器件的通讯过程,单片机利用常见的通讯方式,比如I2C,SPI,1WIRE,UART等协议,与周围的显示,存储,传感器件等交换信息。利用电脑直接发出各种协议的总线信号,直接对器件操作,完成对器件功能的熟悉、评估、或者解密工作,省却了先要编写单片机驱动程序的烦恼。

总线直通车,BUS_PIRATE,是美国开源网站 www.dangerousprototypes.com 设计推出的一款单片机调试和分析工具,可以利用电脑软件和总线直通车相结合,模拟各种单片机的常见协议通讯,方便了工程师的开发过程。

  • 支持1-wire, I2C, UART (async serial), SPI, JTAG, MIDI, LCDs, PC keyboards等常用协议,输入和输出命令和数据.
  • 0-40MHz 频率计数器, 0-4MHz PWM调制输出.
  • 0-6volt 电压表.
  • 板上上拉电阻,能适用于3.3V,5V等不同电压信号
  • Address scanners, chip dumpers, andother helpful macros.
  • USB 接口,虚拟串口工作, USB供电.
  • USB固件升级。
  • 命令行操作模式, 简单易用。