加载中
加载中
表情图片
评为精选
鼓励
加载中...
分享
加载中...
文件下载
加载中...
修改排序
加载中...
串口缓存函数
qazwqsx2016/03/31软件综合 IP:美国
参考了Novakon的算法改了一下队列式缓存。短了很多。

Other
//单纯的算法研究 //小的语法错误请无视 //关于串口接收缓存的研究 #define Max 5 /*****************************************************/ u8 buff[Max]; u8* Out; void SerialManage_ListModel(){//队列式缓存     u8 BuffIn;     int i;     BuffIn=SerialRead();     buff[0]=BuffIn;     for(i==Max-2;i<=0;i++){         buff[i]="buff[i+1];"     } } ***************************************************** 环形缓存 u8* read; write; u8 buff[max]; bool empty; void serialmanage_ringmodel_init(){     read="&buff[0];"     write="&buff[0];" serialmanage_ringmodel_write(){     *write="SerialRead();"     if(write="=&buff[Max-1]){"         ringmanage();         write="&buff[0];"         }         else{         write++; serialmanage_ringmodel_read(){     u8 buff;     buff="*Read;"     if(read="=&buff[Max-1]){"         read="&buff[0];"         read++;         return ringmanage_write(){         if(read="=&buff[Max-1]){"             read++;     < code></=0;i++){>

[修改于 9年6个月前 - 2016/03/31 12:51:27]

来自:计算机科学 / 软件综合
14
新版本公告
~~空空如也
novakon
9年6个月前 IP:广东
814320
感:
1. 变量命名问题很大,Buff和buff一起用,不利于阅读。
2. 缓冲区溢出之后,就要将整个缓冲区shift一个字节(O(N)),性能上不利。
3. 缓冲区内已有的字节个数,应该用一个计数器变量进行计数,而不是每次都从头开始数(O(N))。

总的来说:
1. 如果缓冲区的长度不是5而是65536,这份代码将会超慢。
2. 无法接收0x00。

附本人项目用FIFO缓存代码一份(用于缓冲串口收发数据供异步读写)。

Other
//------------------------------------------ //fifobuffer #ifndef sizeofbuffer #define sizeofbuffer 64 #endif uchar bufferoperating =0; typedef struct{   uchar head;   uchar tail;   uchar buf[sizeofbuffer]; }fifobuffer; void fifobufferinit(fifobuffer *b){   b->head=0;   b->tail=0;   //b->buf=(uchar*)malloc(sizeof(uchar)*bufsize); } void fifobufferin(fifobuffer *b,uchar input){   b->buf[b->tail]=input;   b->tail++;   b->tail%=sizeofbuffer; } uchar fifobufferout(fifobuffer *b){     uchar output=b->buf[b->head];   b->head++;   b->head%=sizeofbuffer;   return output; } uchar fifobufferremain(fifobuffer *b){   if(b->tail < b->head){return b->tail + sizeofbuffer - b->head;}   return b->tail-b->head; }
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
qazwqsx作者
9年6个月前 IP:美国
814325
很厉害,学习了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
9年6个月前 IP:浙江
814329
请不要在已有对主贴内容回复的情况下修改主贴内容
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
qazwqsx作者
9年6个月前 IP:美国
814331
Other
//单纯的算法研究 //小的语法错误请无视 //关于串口接收缓存的研究 #define Max 5 /*****************************************************/ u8 buff[Max]; u8* Out; int Timer; void SerialManage_ListModel_Init(){     Timer=0;     Out=&buff[Timer]; } void SerialManage_ListModel_Read(){//队列式缓存     u8 BuffIn;     int i;     BuffIn=SerialRead();     buff[0]=BuffIn;     Timer++;     for(i==Max-2;i<=0;i++){         buff[i]="buff[i+1];"     }     out="&buff[Timer];" } ***************************************************** 环形缓存 u8* read; write; u8 buff[max]; bool empty; void serialmanage_ringmodel_init(){     read="&buff[0];"     write="&buff[0];" serialmanage_ringmodel_write(){     *write="SerialRead();"     if(write="=&buff[Max-1]){"         ringmanage();         write="&buff[0];"         }         else{         write++; serialmanage_ringmodel_read(){     u8 buff;     buff="*Read;"     if(read="=&buff[Max-1]){"         read="&buff[0];"         read++;         return ringmanage_write(){         if(read="=&buff[Max-1]){"             read++;     < code></=0;i++){>
改进版
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
9年6个月前 IP:广东
814333
真的不想太严苛待人,但是必须给楼主几个忠告:
1. 麻烦找本算法书先看上半年。
2. 你需要实现的东西,别人已经实现了一千遍,所以尽量多谷歌。
3. 不要把“自己想出来的”垃圾代码当成算法研究发到论坛上。



编程,其实就是将编程者脑中的逻辑转化为计算机逻辑,所以首先编程者要在脑子里对问题有清晰的认识。
算法与数据结构方面的知识是你的良师益友,不要跳过它们妄图一飞冲天。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
csaaa
9年6个月前 IP:浙江
814453
引用 qazwqsx:
//单纯的算法研究
//小的语法错误请无视
//关于串口接收缓存的研究
#define Max 5
/*****************************************************/
u8 buff; ...
鼓励一下,不要受别人影响。继续这样下去即可。我看好你。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
9年6个月前 IP:广东
815433
前面这几份都没有临界区保护代码,没太大实用性……
实际多线程、前后台都需要临界区保护的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
9年6个月前 IP:广东
815452
引用 amo:
前面这几份都没有临界区保护代码,没太大实用性……
实际多线程、前后台都需要临界区保护的。
我的架构是异步的,没有这个必要。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
9年6个月前 IP:广东
815476
引用 novakon:
我的架构是异步的,没有这个必要。
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
novakon
9年6个月前 IP:广东
815485
引用 amo:
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
你仔细看我的代码。in和out这两个函数,操作的内存地址并没有重叠……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
9年5个月前 IP:浙江
815560
引用 amo:
正因为是异步的,更容易出问题。
中断会在你的用户程序任何一个地方插入……你在C里的一行语句,可能是需要N条汇编指令才能执行完的
基本的读写函数没必要考虑到这些情况吧,如果存在OS,再补充同步机制(比如利用OS实现自旋锁),或者控制对共享的资源的使用也可以解决。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
amo
9年5个月前 IP:广东
815690
引用 phpskycn:
基本的读写函数没必要考虑到这些情况吧,如果存在OS,再补充同步机制(比如利用OS实现自旋锁),或者控制对共享的资源的使用也可以解决。
从代码里的u8、uchar就能看出是用在资源较少的MCU……
如果封装没做好,出了问题基本上很难查找。
封装可以参考C里的IO函数,如fwrite(),A线程不停写“123”,B线程不停写“456”,C线程不停写“789”,绝不会出现“147”这种数
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
szmoniter
9年4个月前 IP:广东
819282
看这代码的可读性,就毫无兴趣了,1楼的比楼主的要好的多
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
qazwqsx
进士 机友 笔友
文章
30
回复
36
学术分
0
2013/10/20注册,4年2个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的