0%

建立连接

BLE中必须是 Master 发起连接请求,过程如下:

Master 收到广播后发送 CONNECT_IND, 然后连接就建立完成。后面就是开始发送数据包。

阅读全文 »

Connection Parameter Update Procedure 是一个 GAP 的 Procedure,允许 Central 或者 Peripheral 在连接后是可以更新连接参数。一般原厂会提供相关 GAP 的 API, 例如我司的 API 就是

1
int inb_conn_param_update(int conidx, inb_conn_param_update_t *p_upd)

而GAP下面的layer如果实现,则是分为3种情况:

  1. Central 要更新连接参数,但 Central 或 Peripheral 有一个不支持 Connection Parameters Request Procedure,则 Central 用 Link Layer 的 Connection Update procedure 来更新参数。Master 发送 LL_CONECTION_UPDATE_IND 来更新连接参数。

    阅读全文 »

最近碰到一个问题,有个程序是跑在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);

这段代码的输出是什么?

阅读全文 »

最近在刷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的情况,所以取模即可。

阅读全文 »