读书人

dos串口中断处理函数中malloc分配内存

发布时间: 2012-02-29 16:44:10 作者: rapoo

dos串口中断处理函数中malloc分配内存的问题
本人要实现通过串口传输一个比较大的链表。串口一端是vc++编写的程序,一端在dos下用tc编写.tc下程序的串口通讯逻辑已经调通,但是在串口接收到一个链表的数据后,本人想用malloc函数分配内存,存储接收到的数据,但是malloc函数返回总为NULL.串口中断处理函数如下:
void interrupt far asyncint()
{
ch=inportb(0x3f8);
if(ch==0xC0)
{
if(m_bStartGetData)
{
/*数据包接收完毕*/
if(m_ReceivedCount> =23)
DealReceivedData();
DataCount=m_ReceivedCount;
m_ReceivedCount=0;
m_ReceivedBuffer[m_ReceivedCount]=ch;
}
else
{
m_bStartGetData=TRUE;
m_ReceivedCount=0;
m_ReceivedBuffer[m_ReceivedCount]=ch;
}
m_ReceivedCount++;
}
else
{
m_ReceivedBuffer[m_ReceivedCount]=ch;
m_ReceivedCount=(m_ReceivedCount+1)%1024;
}

outportb(0x20,0x20);
} 在DealReceivedData()中存在malloc函数。查资料得知可能是malloc分配还没完成时中断又调用了malloc函数。但是在outportb(0x20,0x20)未输出前,串口中断应该是被禁用了啊,而其他地方也没有用到malloc函数。
另:因为链表比较大,必须采用动态加载的方式每获取一个从串口传过来的数据就必须新建一个节点,是否还有其他的方法可以实现?

[解决办法]
级别不够
看不懂
[解决办法]
建议你还是预先开片内存吧.
[解决办法]
asyncint()线程不安全,在DealReceivedData()调用过程中,asyncint如果再次被调用,m_ReceivedCount重新置为0,则malloc时的长度为0.所以在使用中最好长度和数据不要用成员变量,或者考虑如何安排线程.
[解决办法]
回复人:devilphoenix() ( 一级(初级)) 信誉:100 2007-03-30 16:05:39 得分:0
?
建议你还是预先开片内存吧.
==================================================================================
同意,在处理之前,先把内存开好了,进中断在malloc是不行滴

因为链表比较大,必须采用动态加载的方式每获取一个从串口传过来的数据就必须新建一个节点,是否还有其他的方法可以实现?
==================================================================================
链表比较大,也不是不能实现开辟好内存的,因为毕竟开辟出的内存不是始终被占用,用掉了,就可以回收
至于管理,可以实现一个简单的内存池,开辟一块内存以后,按一定大小分n块,标上序号,然后使用2个链表,把被占用的块和没有被占用的块串起来就行了
[解决办法]
up

读书人网 >C语言

热点推荐