编译时提示 Could not get 12 consecutive bytes in internal RAM for area OSEG

fanfan_gg 2019-05-15 08:40:38
先描述下环境:
单片机使用的是STC15W4K56S
开发环境使用的是CodeBlock+SDCC

工程中使用了tiniux RTOS
实现的功能是通过PWM调光模拟灯光故障效果

由于本人之前一直从事的是上层应用的软件开发,接触嵌入式开发不久,出现这种问题也Google了很多资料,尚未解决问题。
现不确定是硬件资源有限,导致无法实现(感觉可能性很低)
还是自己编程姿势不对(本人无嵌入式扎实基础,可能性较高)
跪求大神指点一二,Teamviewer QQ TIM 论坛指导皆可。

分不够 无以为报 加我VX 请大神喝两杯Starbucks

贴出代码 注意下面注释的位置


void FLRandomFlashing()
{
FLRandomFlashingParm_t __xdata p;
FLRandomFlashingParm_t __xdata* __xdata parm=&p;

PWM_Config(convertPin(parm->Pin));
PWM_Set(convertPin(parm->Pin),parm->StartPWM);

srand(TL0);
u32 durationCounter=0;
u16 PWM=parm->StartPWM;
u16 PWMRange=(parm->PWMUpperLimit)-(parm->PWMLowerLimit)+1;

u32 randomFlashingFragmentDuration;
u16 randomPWM;
u32 changeTimes;
int16_t increment;

while(durationCounter< (parm->TotalDuration))
{
randomFlashingFragmentDuration=((u32)rand())% (parm->FlashingFragmentDurationUpperLimit+1);
durationCounter+=randomFlashingFragmentDuration;
if(durationCounter>=(parm->TotalDuration))
{
randomFlashingFragmentDuration-= durationCounter-(parm->TotalDuration);
randomPWM=parm->EndPWM;
}
else
{
randomPWM=(rand()%PWMRange)+(parm->PWMLowerLimit);
}
changeTimes== ceilf(randomFlashingFragmentDuration /10);
increment =(int16_t)ceilf((int16_t)(randomPWM-PWM))/(int16_t)changeTimes;

while(1)//可以编译通过?!
//for(u32 i=0; i<changeTimes; ++i) 不能编译通过
{
PWM+=increment;
if(PWM>10000)
{
PWM=10000;
}
PWM_Set(convertPin(parm->Pin),PWM);
OSTaskSleep(OSM2T(10));
}
}
}


贴出.mem文件如下:
Internal RAM layout:
0 1 2 3 4 5 6 7 8 9 A B C D E F
0x00:|0|0|0|0|0|0|0|0|a|a|a|a|a|a|a|a|
0x10:|a|a|a|a|d|d|d|d|d|d|d|d|d|d|g| |
0x20:|B|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|
0x30:|b|b|b|b|b|b|b|c|c|c|c|c|c|c|c|c|
0x40:|c|c|c|c|c|c|c|c|c|e|e|e|e|e|e|e|
0x50:|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|e|
0x60:|e|e|e|e|e|e|e|e|e|e|e|e|e|f|f|f|
0x70:|f|f|Q|Q|Q|Q|I|I|I|I|I|I|I|I|I|I|
0x80:|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|
0x90:|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|
0xa0:|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|S|
0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, S:Stack, A:Absolute

ERROR: Couldn't get 18 bytes allocated in internal RAM for area OSEG.
Stack starts at: 0xaf (sp set to 0xae) with 81 bytes available.
The largest spare internal RAM space starts at 0x1f with 1 byte available.

Other memory:
Name Start End Size Max
---------------- -------- -------- -------- --------
PAGED EXT. RAM 0 256
EXTERNAL RAM 0x0001 0x0663 1635 3840
ROM/EPROM/FLASH 0x0000 0x6f80 28545 57344
...全文
505 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ckc 2020-02-16
  • 打赏
  • 举报
回复
内存用超了 单片机内存比较紧张,用的时候要小心 STC15W4K56S一时没找到资料,不知道它内部有没有xdata,如果有的话,把一部分数据移到xdata就可以了 你现在也就是内部那128字节用超了18字节
fanfan_gg 2019-05-16
  • 打赏
  • 举报
回复
没人回 自己拿分吧

27,370

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧