0%

最近碰到一个问题,有个程序是跑在ARM cortex M4上。 之前用-O0编译的时候运行一切正常, 但用-O3编译就会有unaligned的UsageFault。但因为空间的问题又必须用-O3编译。

问题的原因

跟踪调试了一些,出问题的是下面的代码:

1
2
3
4
5
6
uint32_t *txb = (uint32_t*)buf;
while (len) {
uint32_t data = *txb++;//UsageFault
reg_write(addr, data);
...
}
阅读全文 »

一个bug引起的

最近北京那边同事碰到了一个问题,找到我时说是已经搞了四五天, 说是软件发布在即十分紧急啥的。 出问题的代码大概是这个样子:

1
2
3
4
5
6
#define SERVER_NAME "www.foo.com"

void main() {
...
gethostbyname(SERVER_NAME);
}

这段代码就是要通过DNS查找主句IP地址,如果成功的话会有一个callback。 问题是一直都无法正确的获得IP地址。

阅读全文 »

两个面试题

面试时发现很多公司喜欢考一些数组和指针相关的问题。比较常见的是下面这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* main.c */

int a[4] = {1, 2, 3, 4};
extern void foo();
int main()
{
foo();
return 0;
}

/* foo.c */
#include<stdio.h>
extern int *a;
void foo()
{
printf("%d \n", a[0]);
}

问题是这段代码是否可以正常运行?

最近还碰到个题目是这样的:

1
2
3
int a[5] = {1, 2, 3, 4, 5};
int *p = &a + 1;
printf("%d", *p);

这段代码的输出是什么?

阅读全文 »

本文例子大多出自GCC的文档 GCC Macro Doc

Object-like Macros

Object-like marco 只会在使用时才会完全展开。

#define TABLESIZE BUFSIZE
#define BUFSIZE 1024
TABLESIZE
  ==> BUFSIZE
  ==> 1024

##Function-like Macros

function-like macro 只会在后面有 () 才会展开。

1
2
3
4
extern void foo(void);
#define foo() /* optimized inline version */
foo();
funcptr = foo;

注意如果定义了宏 foo(), 而又想定义foo函数,可以采用下面的做法。

1
2
3
4
5
#define foo() //inline function here
void (foo)()
{

}
阅读全文 »

最近在刷leetcode,topcoder上的题目,决定写一些笔记,加深一下印象吧。顺序就是从简单的开始。

Nim Game

1
2
3
4
5
6
7
8
class Solution {
public:
bool canWinNim(int n) {
if (n % 4 == 0)
return false;
return true;
}
};

在n=1,2,3时会赢,n=4时会输。 但n>4时,都可以转化为n<=4的情况,所以取模即可。

阅读全文 »