帖子很久了,不知道还有没有用,按照楼主的文档,发现,移植后编译后,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 固件 移植过来 毕业设计就靠它了
|