2014 三月 | 重归混沌的BLOG

由于滥用void *引发的bug

我一向认为在写代码时,void *滥用是有问题的,在最近的一次代码中, 有类似这样一段代码:   [cc lang=”C”]int send(void *buff, unsigned long size); int xx_func(char *buff, unsigned long size) { unsigned send_size; ……… send(&buff, send_size); return 0; }[/cc] 暂且不论为什么作者会错写成取地址,但其原意是想发送经过处理后的buff里面的内容, 但是编译器是不会报错的,因为void *默认兼容所有类型,如果把代码改成下面这样:……

从TimeQuest角度看create_generated_clock

最近在学SDRAM,听说SDRAM涉及到静态时序分析,那还说什么呢学吧。 在看到create_clock与create_generated_clock时我彻底疑惑了, 即然有了create_clock何必还要create_generated_clock呢,google一翻后得到一个结论,create_generated_clock是用于衍生时钟,TimeQuest作STA分析时会自动计算source clock 到generated_clock之间的skew.我又不明白了即然TimeQuest可以计算时钟偏斜,那直接对source clock进行create_clock不就行了,TimeQuest不就会自动对其衍生时钟偏斜进行分析了么……

从TimeQuest角度看set_max_delay

今天开始看特权大大的《实战演练之时序收敛》,看到set_max_delay时跟着做了一下,设置了最大延时为3ns,然后report timing突然自动飘红了,很意外,于是看了看瓢红的路径的waveform,意外的发现set_max_delay中设置的值成了latch edge time,由于E文不好google了半天也没找到原因,于是再次祭法宝(从TimeQuest方向进行猜测)。由于report timing飘红让我这种初学者心里有压力,于是先将set_max_delay设置为5ns,然后果然不飘红了。开始找原因吧,先去data require path看看,果然latch e……

BL指令实际做出的操作

经测试证明,使用BL时,此指令做出如下操作 LR=PC+T,T位是CPSR里的T位,标志着是否是thumb状态!

关于keil编译cortex-m3纯汇编时为什么问题使用align地址问题

在编译下面一段代码时: STACK_TOP EQU 0x20002000 AREA Reset,CODE,READONLY DCD 0x20002000 DCD Start ENTRY ; CODE16 Start ldr r2,=Test LDRD r0,r1,[r2,#4] LDRD r0,r1,[r2] LDRD r0,r1,[r2] ; movs r0,r0 ; NOP ; align 4 Test DCD 0x12345678 END 我发现,如果加上NOP或align4,程序就不会跑飞,否则程序就跑飞了。 经调试发现:    如果不加NOP或align 4的话产生的Test的标号地址就会产生错误,而LDRD 指令操作的地址必须是4字节对节的,如果使用的地址不是四字节对齐,那……

cortex-m3中存储器的访问属性中的共享属性

cortex-m3中的共享属性是用来多核处理器进行共享的一块区域!

stm32的窗口看门狗的一点发现

今天看stm32的窗口看门狗,突然发现很不正常,于是做了各方面的实验得出以下结论,由于只是实验了得出的结论没有官方结论,所以如果有人有理论依据请告知我,非常感谢1 1.一旦使能窗口看门狗的时钟,SR寄存器的EWIF位就会被置1 2.一旦在定义的窗口范围外喂狗就会复位 3.在没有使能窗口看门狗定时器的情况下(即CR寄存器的WDGA寄存器置1来使能看门狗),SR不能被软件清0 结论:所以必须把窗口看门狗的清0,使能中断放在初始化的最后2句才能正常运行!

关于stm32 APB总线上的”接口时钟使能”与”外设时钟使能”

今天看上的RTC时钟,发现他没有使能APB1的上BKP时钟,就能读出BKP寄存器里的内容.很是不解,又看了一遍发现APB总线上的时钟使能分为两种,一种是时接口时钟一种是外设时钟. 又仔细观查了一下时钟树发现在APB外设时钟使能寄存器上表现为接口时钟的都已经有了自己的时钟,再经实验证明所有这种不需要在APB上使能就有自已时钟的外设(即在APBxENR的某一位上代表的是这个外设的接口时钟的外设)在不需要使能接口时钟的情况下就能读出这种外设的寄存器的内容!

一次手误引出的bug

  在工作中写了这样一段代码: 1 struct xx_param { 2 int index1; 3 int index2; 4 }; 5 6 //func1, func2, func3为三个函数指针 7 8 int init(a_func_t *func1, b_func_t *func2, c_func_t *func3, void *param) 9 { 10 struct xx_param *p = (struct xx_param *)param; 11 func1(p->index1, p->index2); 12 } 13 14 int prepare_init(int xx_index_1, int xx_index_2) 15 { 16 int err; 17 struct xx_param ……

CheckSum计算的优化

  最近在纠结于大数据的checksum的计算,算法如下: 1 unsigned long cs_cal(const unsigned char *buff, unsigned long size) 2 { 3 unsigned long cs; 4 5 cs = 0; 6 while (size--) 7 cs += buff[size]; 8 9 return cs; 10 }   当文件大于4G后这种计算的龟速就很明显了,在网上看到大牛说MMX指令对于数据计算相当不俗,于是改成下面代码(bug:不对齐部分没有处理,这部分消耗很小,对于效率影响不大): 1 unsigned long cs_cal(const……