电路设计简介
- CC2640 的 RF 差分线越短越好,做差分 100Ω 阻抗匹配。
- 天线部分阻抗 50 欧姆匹配,本次设计采用了陶瓷天线 AN9520-245 减少天线面积。
- 蓝牙芯片在底层,阻抗参考平面第三层,在天线部分下方覆铜(GND),使用嘉立创的阻抗匹配计算器计算线宽。
- 巴伦采用分立设计,参考官方文档。ST 公司的 BlueNRG-2 BLE 芯片可采用 BALF-NRG-02D3 巴伦封装。
- 天线部分转角做弧线。
- 可将天线线路做包地处理,减少信号干扰。
嵌入式开发
这里说的所有内容都是基于 ProjectZero 项目进行二次开发的
关于在 RTOS 中创建 Task 的一点灵感
CC2640 中分配内存主要使用的是:
void *ICall_malloc(uint_least16_t size);
配套用于释放内存的函数是:
void ICall_free(void *msg);
在这个灵感中会用到动态内存的创建和释放,所以可以稍微包装下:
mem.c 文件
#include "mem.h"
#include <icall.h>
void* c_malloc(uint_least16_t size) {
return ICall_malloc(size);
}
void c_free(void* ptr) {
ICall_free(ptr);
}
因为很多时候创建任务的一些结构体还有 Task 所需的缓存大小都差不多,主要是想偷偷懒,所以提前分配好一些 Task 的结构体和相关的缓冲区是否能少写一点代码呢?(我不确定这是不是个好办法但确实可以偷懒)
这是 task.c 的实现方式
#include "task.h"
#include "mem.h"
//#include <uartlog/UartLog.h>
static TASK_FACTORY _G_TASK_FACTORY = {
0, 0, 0, 0, 0, false};
void task_init(uint32_t task_num, uint32_t stack_size) {
if (_G_TASK_FACTORY.is_init) return;
_G_TASK_FACTORY.is_init = true;
_G_TASK_FACTORY.task_capacity = task_num;
_G_TASK_FACTORY.stack_capacity = stack_size;
_G_TASK_FACTORY.tasks = (Task_Struct*)c_malloc(task_num * sizeof(Task_Struct));
_G_TASK_FACTORY.stack = (uint8_t*)c_malloc(task_num * stack_size);
}
int task_run(uint8_t priority, Task_FuncPtr func) {
if (!(_G_TASK_FACTORY.is_init) || _G_TASK_FACTORY.task_size >= _G_TASK_FACTORY.task_capacity) {
return -1;
}
Task_Params taskParams;
Task_Params_init(&taskParams);
taskParams.stack = _G_TASK_FACTORY.stack + _G_TASK_FACTORY.stack_capacity * _G_TASK_FACTORY.task_size;
taskParams.stackSize = _G_TASK_FACTORY.stack_capacity;
taskParams.priority = priority - 1;
Task_construct(_G_TASK_FACTORY.tasks + _G_TASK_FACTORY.task_size, func, &taskParams, NULL);
_G_TASK_FACTORY.task_size++;
return 0;
}
以闪烁 LED 灯为例使用这两个函数:
led_task.c
#include "led_task.h"
#include "../core/task.h"
#include "ti/drivers/PIN.h"
#include "driverlib/ioc.h"
#include