mark。
呵呵。LZ可以再加一些关于库调用的内容,比如说在做TCPMP或者DX播放器的时候有些库的引用。DX在wince下调试还是有些技巧,呵呵。
我记得调DX的时候vs2005下面dx有一些原始的dx代码文件是需要修改一下的。呵呵。
受教了,LZ真是好人哇~经验这东西很重要,自己去实践发现往往需要花费很多的时间.
支持楼主。不过还是提倡Linux等开源方式的开发。
赞~~~
类型转换的存取中,如果整形变量不对齐在4边界位置上导致崩溃的问题的CE上出现很严重啊。。。。
这些都是做软件必须要遵守的一些常规!今天还用在这里强调???
另外, NandFlash文件操作的问题,改写文件内容确实会引起FAT表的擦除,因为Flash的擦除是有寿命次数的,频繁改写同一个文件会减少Flash的寿命。不过这不是问题,现在的Flash都有10万次以上的擦写寿命。另外,也不会引起文件系统出错,要是出错,就是你的系统有问题,或者是Flash驱动,或者是坏块管理上的。我们做的系统如果Flash是128M的,要做一个测试程序,反复读写100M的文件,几天几夜不停的测试。
引用: 引用 55 楼 yangcuncunzhang 的回复:
这些都是做软件必须要遵守的一些常规!今天还用在这里强调???
另外, NandFlash文件操作的问题,改写文件内容确实会引起FAT表的擦除,因为Flash的擦除是有寿命次数的,频繁改写同一个文件会减少Flash的寿命。不过这不是问题,现在的Flash都有10万次以上的擦写寿命。另外,也不会引起文件系统出错,要是出错,就是你的系统有问题,或者是Flash驱动,或者是坏块管理上的。我们做的系统如果Flash是128M的,要做一个测试程序,反复读写100M的文件,几天几夜不停的测试。
帖子只是对前几天改完软件bug遇到的一些问题,做了一些总结和大家分享一下,并没有强调的意思,同时也是希望大家能把自己一些好的想法也发出来,共同讨论进步。
引用: 引用 55 楼 yangcuncunzhang 的回复:
这些都是做软件必须要遵守的一些常规!今天还用在这里强调???
另外, NandFlash文件操作的问题,改写文件内容确实会引起FAT表的擦除,因为Flash的擦除是有寿命次数的,频繁改写同一个文件会减少Flash的寿命。不过这不是问题,现在的Flash都有10万次以上的擦写寿命。另外,也不会引起文件系统出错,要是出错,就是你的系统有问题,或者是Flash驱动,或者是坏块管理上的。我们做的系统如果Flash是128M的,要做一个测试程序,反复读写100M的文件,几天几夜不停的测试。
本人WinCE5.0+eVC+CF卡,用在工业机器上,因希望机器的实时数据能够保存,约每秒写一次CF卡,数据不多约1K,不知大侠有没有这方面的经验?是否会对CF卡的内容或结构造成损坏?望指教。本人对CF卡知识了解不够。
本人的补充加问题:
1.指针的使用不能越界,否则很可能误修改其他变量的值,导致不可预测的结果,而且进行错误定位时,错误往往并不是在错误发生的地方。这个错误虽然大家都知道,但是本人这次还是犯了。
--指针的使用不能越界,这是常识,不仅是WinCE
2.不要过于频繁的修改存储在NandFlash的文件,NandFlash写之前必须先擦除,所以每次修改一点内容,FAT文件目录表等信息都需要擦除重写,和电脑硬盘上的Fat系统操作是不一样的,而且长时间频繁操作还会导致nandflash Fat系统出错(不知道是不是我个人系统问题)。
另外, NandFlash文件操作的问题,改写文件内容确实会引起FAT表的擦除,因为Flash的擦除是有寿命次数的,频繁改写同一个文件会减少Flash的寿命。不过这不是问题,现在的Flash都有10万次以上的擦写寿命。另外,也不会引起文件系统出错,要是出错,就是你的系统有问题,或者是Flash驱动,或者是坏块管理上的。我们做的系统如果Flash是128M的,要做一个测试程序,反复读写100M的文件,几天几夜不停的测试。
--本人WinCE5.0+eVC+CF卡,用在工业机器上,因希望机器的实时数据能够保存,约每秒写一次CF卡,数据不多约1K,不知大侠有没有这方面的经验?是否会对CF卡的内容或结构造成损坏?望指教。本人对CF卡知识了解不够。
3.对于重要区域数据应注意保护,比如nandflash内核文件(我在驱动中做了应用程序访问整个NandFlash的底层接口),因误擦除内核某个块的内容导致系统断电后不能启动。
--同上
4.全局变量勿嵌套使用,如果是在循环中发生全局变量嵌套使用很可能导致程序死循环,或其他奇怪的结果。
--本人经常嵌套使用全局变量,因为全局变量用来做状态标记很好,但是写程序时必须注意到变量值的变化,不注意到变量值的变化怎么叫写程序呢?
--还有,WinCE的内存机制与Win98/2k/xp不同,因为它常用于嵌入式设备上,嵌入式设备多数是小内存。如果你反复开辟内存,比如不断地new,delete,尽管你都做了delete,但内存的“碎片”会越积越多,尤其是在CPU速度慢的设备上,系统还没来得及delete,你又new了。非数组变量也是同样,比如函数内的局部变量,你调用该函数的次数越多越快,内存的“碎片”就越多,所以还是多用全局变量。
--这仅是个人经验,希望大家探讨。
--楼主认为“很可能导致程序死循环”,原因是楼主用了全局变量来判断循环状态,应该这样:
for(int i=0; i
{
for(int j=0; j
{
//...
}
for(int k=0; k
{
//...
}
}
如果不用MFC,则先在前面int i=0,j=0,k=0;
可能楼主在该用k的地方用了i -- 这仅是本人用来分析楼主的观点,举例说明。
多用几个i,j,k,m,n,可以保证不出问题,程序写完多检查--不检查也叫写程序吗?如果你不愿多检查,那么以下原则适用:每处的循环判断变量用上面没有用过的。
5.程序中用到结构体的大小时,尽量使用sizeof计算,而不要用常数,这样可以避免因结构体在使用中改动而带来的错误。
--这个总结很好,当然也可以用#define XXX // 常数,比如:
#define XXX 10
int abc[10];
for(int i=0, i
{
abc = 0;
}
这样在数组的大小要变动时,改XXX就可以了,结构体同理。
6.文件的操作:(1)打开属性为只读,则操作过程中不要企图写文件。(2)文件关闭后,不要再用文件句柄进行进行读写,否则应用程序很可能会直接退出。(3)文件Seek时不要越界。(4)不要频繁修改大文件,否则程序运行速度会很慢。
--这是写程序的基本修练,谁都知道“打开属性为只读,则操作过程中不要企图写文件”,谁都知道“文件关闭后,不要再用文件句柄进行进行读写”。
--针对“文件Seek时不要越界”,你要有好的习惯,每次读文件时加个if(!eof(handle/*文件句柄*/))再读
--第4条,任何语言写的程序,任何机器都是这样吧?
7.一个INT或Long型数据存在单字节数组中传输后解析一定要用无符号数组进行解析。
int COnLineDlg::Byte4ToInt(const BYTE *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}
不能用:
int COnLineDlg::Byte4ToInt(const char *p)
{
return (p[0] < <0)+(p[1] < <8)+(p[2] < <16)+(p[3] < <24);
}。
或者直接用memcpy也可以。
--如果你理解数据如何存储,负数如何表示,就没有这个问题了。你用强制类型转换更有效,比如:
BYTE bb = 0x2E;
int aa = int(bb);
楼主的例子是数组,也是同理。如果楼主的“传输”包括两地硬件,如COM通讯,则方法很好,本人也常用。
--memcpy、memset...等等,本人多年来都一直怕用,不仅是在WinCE上。
--本人也补充了一些东东,希望大侠们帮我解决一下问题,谢谢!
上面正确的为:
#define XXX 10
int abc[XXX];
for(int i=0, i
{
abc = 0;
}