编程思维的点滴

编程思路要清晰,要对自己所要做的事情有个百分之一百二十的了解。
不能模棱两可差不多就行。
往后的日子还很长,只图一时的爽快,将得不偿失,不值得,
甜在前头,苦在哭在后头,是令人很烦恼的一件事情。
无论时间多么仓促,自己都要想办法弄清楚自己所面对的是什么东西,
我要把它做成什么样子,做到什么程度。

做任何事情,试错没有问题,但不能不经过大脑而满目的如无头苍蝇一般胡乱瞎捉摸,那样只是做无用功,甚至会适得其反。
要经过自己的脑袋思索一番,想象一番,沿着可能的条件和方向摸索,
你会像在黑暗中摸索前进的道路一样,你会渐渐靠近出口,渐渐靠近光明。

编写软件,要分清程序的架构,层与层、模块与模块、接口与接口之间的联系。

既要熟悉各层、各模块、各接口的内容,
也要熟悉它们组合后系统的概貌和逻辑,
知道系统是什么,它能干什么,不能干什么。

以windows下程序为例。
它们分用户模式和内核模式。

用户模式的程序有应用程序、用户dll和系统dll。
内核模式有内核、驱动程序和硬件。

从分分层的角度看,由上往下,一次是应用层程序,然后是dll、lib库,
然后是驱动,然后是fpga,然后是硬件。

在编写驱动的时候,有时候需要上层的东西。
一个寄存器,它里面的bit位被用于不同的作用。
现在要扩充一个寄存器的一个bit位,
很显然,应用层需要修改,lib需要改动,同样驱动也要改。
比如:

typedef union EXAMPLE
{
    struct 
    {
        ULONG a : 1;
        ULONG reserve : 31;

    }u;
    ULONG v;
};

typedef _REGISTER 
{
    ULONG r_example;
    ...;
}REGISTER, *PREGISTER;

VOID SetRegistereR_exampleA(PREGISTER reg, ULONG a)
{
    ULONG v;
    EXAMPLE e;
    e.v = READ_REGISTER_ULONG(&reg->r_example);
    e.a = a;
    WRITE_REGISTER_ULONG(&reg->r_example, e.v);
}

现在union EXAMPLE里要扩展u的一个bit位,比如扩展成如下:

typedef union EXAMPLE
{
    struct 
    {
        ULONG a : 1;
        ULONG b : 1;
        ULONG reserve : 30;

    }u;
    ULONG v;
};

那么要增加一个设置b的接口,可以把函数SetRegistereR_exampleA扩展一个参数,如下:

VOID SetRegistereR_exampleA(PREGISTER reg, ULONG a, ULONG b)
{
    ULONG v;
    EXAMPLE e;
    e.v = READ_REGISTER_ULONG(&reg->r_example);
    e.a = a;
    e.b = b;
    WRITE_REGISTER_ULONG(&reg->r_example, e.v);
}

但这样改接口SetRegistereR_exampleA,会带来所有调用SetRegistereR_exampleA地方的修改,一些调用SetRegistereR_exampleA的地方,没有办法获得ULONG b参数信息,
因此扩展SetRegistereR_exampleA一个参数不是一个好办法,有的时候都不能这么弄。
看看SetRegistereR_exampleA函数里面,它是读一个寄存器,只是修改跟a相关的,再写寄存器,因此,可以再写一个接口SetRegistereR_exampleB,专门修改b,
比如如下代码:

VOID SetRegistereR_exampleB(PREGISTER reg, ULONG b)
{
    ULONG v;
    EXAMPLE e;
    e.v = READ_REGISTER_ULONG(&reg->r_example);
    e.b = b;
    WRITE_REGISTER_ULONG(&reg->r_example, e.v);
}

SetRegistereR_exampleB函数是,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值