帖子很久了,不知道还有没有用,按照楼主的文档,发现,移植后编译后,ucos 不能正常的运行。会不停地重启。
用的是 arduino IDE 1.5.5 和 1.6.6 和
修改的地方
\hardware\arduino\cores\arduino\main.cpp,注释init()和loop();
int main(void)
{
//init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
//loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
\hardware\arduino\cores\arduino\wiring.c,注释SIGNAL(TIMER0_OVF_vect)
#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
ISR(TIM0_OVF_vect)
#else
// ISR(TIMER0_OVF_vect)
void ddddd(void)
#endif
{
// copy these to local variables so they can be stored in registers
// (volatile variables must be read from memory on every access)
unsigned long m = timer0_millis;
unsigned char f = timer0_fract;
m += MILLIS_INC;
f += FRACT_INC;
if (f >= FRACT_MAX) {
f -= FRACT_MAX;
m += 1;
}
timer0_fract = f;
timer0_millis = m;
timer0_overflow_count++;
}
③\hardware\arduino\cores\arduino\wiring.c,修改init()关于定时器0的初始化,由64分频改为1024分频;
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
// this combination is for the standard 168/328/1280/2560
// sbi(TCCR0B, CS01);
// sbi(TCCR0B, CS00);
sbi(TCCR0B, CS02);
cbi(TCCR0B, CS01);
sbi(TCCR0B, CS00);
如此修改后编译代码,下载,发现13号脚上的led 会闪烁,原因是重启了
按照 楼主在豆瓣上 《arduino嵌入ucos系统的设想》 的帖子提示,还是没整理出来结果
奇怪的一点是,在每个任务开始的入口,都要调用功能和原来setup()一致的函数一次。就是说,我在任务一调用Serial.begin(9600);;如果在任务二不调用Serial.begin(9600);,则整个代码的运行都会出现问题。
很高兴,停了一天之,捋了一下思路,今天终于找到了问题所在。
1。得到编译后的elf链接文件,用AVRStudio打开后,按照提示进入软件仿真环境,这时候就可以查看反汇编代码了。应该感谢GCC和AVRStudio的作者。
2。通过跟踪代码的运行(就是狂按F5、F9、F10、F11),在一个简单的逻辑判0上出错了。C代码if(base == 0)(此语句源于Arduino)在前一个任务运行时判断是正确。到第二个任务运行之初就发生了错误了跳转。
3。发现了第二点之后,反汇编之。哈哈,果然,用于存储base的R1寄存器和形参的值居然不一致。
4。之所以会不一样,是在该任务初始化的时候R1寄存器装入了错误的值。此时,只需要在任务初始化的时候,将R1赋值1就解决了。
请求指点一下,现在想arduino上运行ucos ii 并且把整个 3D打印用的 marlin 固件 移植过来 毕业设计就靠它了 |