编程思维的点滴

来源:互联网 发布:中国知网cnki数据库 编辑:程序博客网 时间:2024/05/16 09:01

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

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

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

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

以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
原创粉丝点击