先描述下環境:
單片機使用的是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
uj5u.com熱心網友回復:
沒人回 自己拿分吧uj5u.com熱心網友回復:
記憶體用超了單片機記憶體比較緊張,用的時候要小心
STC15W4K56S一時沒找到資料,不知道它內部有沒有xdata,如果有的話,把一部分資料移到xdata就可以了
你現在也就是內部那128位元組用超了18位元組
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/56224.html
標籤:單片機/工控
