搜索
bottom↓
回复: 15

如何用ICCAVR在每次外部中断后,用malloc申请一个内存空间,然后形成一个链表?

[复制链接]

出0入0汤圆

发表于 2008-8-17 15:00:40 | 显示全部楼层 |阅读模式
_NewHeap(&_bss_end+1, &_bss_end + 501);

             pRxFrameStruct_New = (RX_FRAME_STRUCT *)malloc(sizeof(RX_FRAME_STRUCT));
         if(pRxFrameStruct_Head == (RX_FRAME_STRUCT *)0)//
         {
          pRxFrameStruct_Head = pRxFrameStruct_New;
              pRxFrameStruct_Head->PPreRxFrame = (RX_FRAME_STRUCT *)0;                    
         }
             else
             {
               pRxFrameStruct_Last -> PNextRxFrame = pRxFrameStruct_New;
                   pRxFrameStruct_New -> PPreRxFrame = pRxFrameStruct_Last;

            
             }
           pRxFrameStruct_Last = pRxFrameStruct_New;

以上指针都是全局变量。发现每次进入中断后申请,都是从bss_end+1开始申请,把原先的覆盖掉了。怎么回事呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-8-17 21:15:03 | 显示全部楼层
我在ICC下用malloc 申请不成功,期待中...

出0入0汤圆

发表于 2008-8-18 00:36:08 | 显示全部楼层
看到这么复杂的中断程序,先晕2分钟



贴出ICC的帮助

􀀗 void *malloc(size_t size)
allocates a memory chunk of size size from the heap. It returns 0 if it cannot
honor the request.
􀀗 void _NewHeap(void *start, void *end)
initializes the heap for memory allocation routines. malloc and related routines
manage memory in the heap region. See Program Areas for information on
memory layout. A typical call uses the address of the symbol _bss_end+1 as the
“start” value. The symbol _bss_end defines the end of the data memory used by
the compiler for global variables and strings. You add 1 to it since the Stack
Checking Functions use the byte at _bss_end to store a sentinel byte. The “end”
value must not run into the stacks.
extern char _bss_end;
_NewHeap(&_bss_end+1, &_bss_end + 201); // 200 bytes heap
Be aware that for a microcontroller with a small amount of data memory, it is often
not feasible or wise to use dynamic allocation due to its overhead and potential for
memory fragmentation. Often a simple statically allocated array serves one’s
needs better.


说说我的猜想,可能是内存分配链表被中断程序保护了,所以,每次分配完毕,中断退出后,又还原了。也就是说malloc不是一个可以重入的函数

我从来不用这个函数,因为消耗资源,不如自行编写一个内存管理器,更好更安全

出0入0汤圆

发表于 2008-8-18 01:01:41 | 显示全部楼层
malloc那个慢呀.....楼主可不要把PC里的什么东西都往单片机里搬哟....

出0入0汤圆

发表于 2008-8-18 09:42:20 | 显示全部楼层
对动态分配内存有兴趣。
单片机一样可以用动态分配内存。

问题是我们必须要知道动态内存分配做了些什么,是怎么实现的,
才能更好地在单片机上使用动态分配内存。

请问:有没有关于malloc函数的算法资料或者源代码?

出0入0汤圆

发表于 2008-8-18 19:33:01 | 显示全部楼层
malloc各家实现都不一样的。除了嵌入式领域或者特殊用途领域(比如分配固定长度),比较通用的malloc实现都非常复杂。

http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/malloc.c?rev=1.147.2.4;content-type=text%2Fx-cvsweb-markup


http://www.libsdl.org/cgi/viewvc.cgi/trunk/SDL/src/stdlib/SDL_malloc.c?revision=3372&view=markup

出0入0汤圆

发表于 2008-8-18 19:36:25 | 显示全部楼层
lz不会是                   _NewHeap(&_bss_end+1, &_bss_end + 501);   这句也放在ISR里了吧。

出0入0汤圆

 楼主| 发表于 2008-8-19 13:12:31 | 显示全部楼层
我试过了,放在一般的函数中,也是会出现这种情况。。

出0入0汤圆

发表于 2009-2-18 14:30:41 | 显示全部楼层
分配内存空间。除了malloc,还有其他的办法分配吗?

出0入0汤圆

发表于 2009-2-18 16:06:46 | 显示全部楼层
学UCOS,事先定义一个大的缓冲区区,每次分配时,取一小块。

出0入0汤圆

发表于 2009-8-27 12:07:23 | 显示全部楼层
学习,有人说定义数组比用malloc占空间,不理解,高人解释一下。

出0入0汤圆

发表于 2009-12-16 17:04:19 | 显示全部楼层
_NewHeap(&_bss_end+1, &_bss_end + 501);  
每次中断都重新初始化了堆,是这个原因吧,楼主

出0入0汤圆

发表于 2009-12-16 18:14:32 | 显示全部楼层
volatile unsigned char semaphore_count = 0;



//in ISR
{
        ...
        semaphore_count++;
        ...
}

//in main()
while(1)
{
        while(semaphore_count--)
        {
                temp_ptr = malloc();
                temp_ptr->next = head;
                head->prev = temp_ptr;
                head = temp_ptr;
                head->prev = NULL;
        }
        ...
}

出0入0汤圆

发表于 2010-1-30 05:11:19 | 显示全部楼层
???
还有回复处于“待审核”状态?

出0入0汤圆

发表于 2013-9-24 12:46:35 | 显示全部楼层
malloc不成功显示没有putchar的定义。。。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表