用到的一些rtt特性
RingBuffer
串口接收部分采用了RTT自带的ringbuffer功能来实现数据的接收和保存,环形缓冲区在批量处理数据的时候非常好用,极大的降低了使用难度,以下是一些粗略的代码调用。
static uint8_t uart_ringbuf[32] = {0}; static struct rt_ringbuffer uart_rb;
rt_ringbuffer_init(&uart_rb, uart_ringbuf, 32);
rt_ringbuffer_reset(&uart_rb);
void user_uart0_callback (uart_callback_args_t * p_args)
{
switch (p_args-》event)
{
case UART_EVENT_RX_CHAR:
{
rt_ringbuffer_putchar(&uart_rb, (const rt_uint8_t )(p_args-》data));
break;
}
default:
break;
}
}
rt_size_t num = rt_ringbuffer_get(&uart_rb, buff, uart_rx_len);
rt_kprintf(“uart0 ringbuf get size:%dn”, num);
MailBox
通过查看API文档发现邮箱是一个更轻量的通知功能实现方式,使用起来也非常简单,在此次项目中担当了串口接收完成通知的任务。以下还是一些粗略的代码。
while (1)
{
if (rt_mb_recv(&uart_mb, &mb_flag, RT_WAITING_FOREVER) == RT_EOK) {
rt_kprintf(“uart0 mb recv %d len is %dn”, mb_flag, uart_rx_len);
rt_size_t num = rt_ringbuffer_get(&uart_rb, buff, uart_rx_len);
rt_kprintf(“uart0 ringbuf get size:%dn”, num);
}
void user_uart0_callback (uart_callback_args_t * p_args)
{
switch (p_args-》event)
{
case UART_EVENT_RX_CHAR:
{
rt_ringbuffer_putchar(&uart_rb, (const rt_uint8_t )(p_args-》data));
uart_rx_len++;
if (uart_rx_len == 19) {
if (rt_mb_send(&uart_mb, 0x01) != RT_EOK) {
rt_kprintf(“uart0 mailbox send errn”);
}
}
break;
}
default:
break;
}
}
3、总结
此次活动粗略的实现了一个简单的加解密协处理功能,可以初步的实现基本功能,但仍有以下问题尚未解决,这里列出来以供参考。
内置秘钥没有混淆,明文存储是非常致命的问题,这里推荐使用matrix编码进行混淆存储。
当前试验机并没有实现DH秘钥交互,使用DH秘钥交互可以为每次会话生成完全随机的秘钥,提高安全性可靠性,当然也可以使用ECDH交互(效率问题不用过于担心,因为秘钥交互只存在于初始化握手),DH推荐使用mbedtls自带库,ECDH推荐使用tiny-ECDH-c.
没有完全实现串口空闲中断,后续需要调试GPT来实现
代码体积还需要优化
原作者:dreamcmi