初级会员

- 积分
- 174
- 金钱
- 174
- 注册时间
- 2018-2-24
- 在线时间
- 44 小时
|
5金钱
如标题,程序编译报错,共19个error,标题是第一个。程序是通过串口接收数据,临时存放在字符数组中,然后再写入W25Q16芯片。代码如下。网上有说是数组过大,堆栈溢出。因此我使用了malloc和free来给数组临时分配内存空间。但错误依然没有消失。请问有没有人遇到过,求指教!
//任务4的任务函数----接收串口发送的数据,并写入FLASH,执行一遍就挂起
void task4_task(void *p_arg)
{
u8 * data_buff;
int len,t;//最大65535
OS_ERR err;
// CPU_SR_ALLOC();
p_arg = p_arg;
// OS_CRITICAL_ENTER(); //进入临界区,任务禁止打断
while(1)
{
if(USART_RX_STA&0x8000)//收到数据了
{
data_buff=(u8 *)malloc(18000);//使用内存管理为数组分配内存,避免堆栈溢出
memset(data_buff,0,sizeof(u8)*18000);//内存初始化为0
len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度,数据总量不超过65535
for(t=0;t<len;t++)
{
data_buff[t]=USART_RX_BUF[t];
}
printf("Start Write W25Q16....");
W25QXX_Write(data_buff,FLASH_SIZE-18000,len); //从倒数第18000个地址处开始,写入len长度的数据(len小于18000字节,否则增加地址大小)
printf("W25Q16 Write Finished!"); //提示传送完成
free(data_buff);//释放大数组所占的内存空间
USART_RX_STA=0;//事情办完,清空接收数据状态标记
}
// OS_CRITICAL_EXIT(); //退出临界区
}
}
|
最佳答案
查看完整内容[请看2#楼]
找到了这篇帖子,说KEIL模拟的内存比实际的小,可以在Target选项卡里加大:https://www.cnblogs.com/cxcmirror/p/14671296.html
我照着做了,末尾都加了一个0,果然错误减少到了1个。启动文件的堆栈还是400和200,数组大小还是18000,依然使用了malloc和free.但是不知道这样改行不行,会不会对单片机造成影响。
|