打印
[PIC®/AVR®/dsPIC®产品]

关于PIC18移植uCOS

[复制链接]
4870|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
keal224324|  楼主 | 2013-7-23 17:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
楼主想要学习操作系统的知识,然后就开始学习uCOS,正好手头有PIC18F25K80单片机一枚。就开始移植,但是出现了一个奇葩的现象:

在运行过程中,我发现程序不能进入我的任务中,于是我单步执行。发现程序初始化的过程中出现上面的现象。执行完:   
    OSIntNesting  = 0;                                           /* Clear the interrupt nesting counter      */
    OSLockNesting = 0;                                           /* Clear the scheduling lock counter        */
    OSTaskCtr     = 0;                                           /* Clear the number of tasks                */
    OSRunning     = FALSE;                                       /* Indicate that multitasking not started   */
    OSCtxSwCtr    = 0;                                           /* Clear the context switch counter         */
    OSIdleCtr     = 0L;   
右下角Watch中对应的寄存器竟然没有改变。
哪里有大神帮忙解惑。
我的LKR文件如下做了一些改动,是不是这里出了问题:

沙发
tianyazhix| | 2013-7-23 17:38 | 只看该作者
顶楼主,你把代码上传上来,别人才好帮你分析哈

使用特权

评论回复
板凳
dogglove| | 2013-7-24 00:46 | 只看该作者
把整个项目传上来
,分析啊

使用特权

评论回复
地板
keal224324|  楼主 | 2013-7-24 09:02 | 只看该作者
其实没什么特别的地方,都是uCOS的源代码。我就上传一下整个Project吧

uCOS_II.zip

231.47 KB

使用特权

评论回复
5
dogglove| | 2013-7-24 13:18 | 只看该作者
你的程序UCOS2
       INTERRUPT SERVICE ROUTINE HOOK
*
* Description:  This function is called when a interrupt service routine is call.  The state of the
*               current proccess is already saved.  This allows you to order the responses and to
                call your own coded for interrupts.
*
* Arguments  :  none
*
* Note(s)    :  1)  OSTimeTick() must be called from the timer routine that is pulsing at 10 to 100 times
*                   a second.
*               2)  You must clear the interrupt before calling OSTimeTick().
*********************************************************************************************************
*/
void CPUlowInterruptHook(void)
{

static INT32U timenum=0;
    if(INTCONbits.TMR0IF) {                     // check for TMR0 overflow
        INTCONbits.TMR0IF = 0;                  // clear interrupt flag
        TMR0H = 0x9E;                           // set the timer to expire in 10 ms. (at 10MHz)
        TMR0L = 0x44;
        OSTimeTick();                           // Call required os timer
    }
这块没有进啊
系统的心脏没有启动

使用特权

评论回复
6
keal224324|  楼主 | 2013-7-24 13:53 | 只看该作者
dogglove 发表于 2013-7-24 13:18
你的程序UCOS2
       INTERRUPT SERVICE ROUTINE HOOK
*

请问怎么进去呢?

使用特权

评论回复
7
keal224324|  楼主 | 2013-7-24 13:57 | 只看该作者
在出错的地方看了一下反汇编,发现寄存器的地址都发生了错误:

OSRunning在反汇编中的地址是:0x04,而在Watch中看到的地址是0x104。问题应该就出在LRK的分区上,不知道怎么改才正确。如果还是改为原来的分区的话,编译都不能通过

使用特权

评论回复
8
keal224324|  楼主 | 2013-7-24 17:33 | 只看该作者
哎,已确定是LKR文件的问题。不知道怎么设置BANK比较好

使用特权

评论回复
9
keal224324|  楼主 | 2013-7-26 09:56 | 只看该作者
http://blog.csdn.net/kingkong529/article/details/5702665
CSDN果真是好网站,按着这个方法解决了LINK的问题。

使用特权

评论回复
10
yklstudent| | 2013-7-26 11:55 | 只看该作者
keal224324 发表于 2013-7-26 09:56
http://blog.csdn.net/kingkong529/article/details/5702665
CSDN果真是好网站,按着这个方法解决了LINK的 ...

请问 你是怎么修改lkr的? 问题解决了吗??

使用特权

评论回复
11
keal224324|  楼主 | 2013-7-26 13:54 | 只看该作者
yklstudent 发表于 2013-7-26 11:55
请问 你是怎么修改lkr的? 问题解决了吗??

并没有修改LKR,修改LKR会导致单片机寻址错误。
在分配内存地址的时候,使用#program udata XX 给大的数据块分配足够的空间。不过我也不确定我是不是已经真正解决问题了,现在我还没有调试好,OSSTART()以后还是不能进入任务。
卡在了OSStartHighRdy()的最后一个命令上:
    // execute a return from interrupt instruction
_asm
    RETFIE 0
_endasm

真是难搞,我都快放弃了

使用特权

评论回复
12
yewuyi| | 2013-7-26 14:00 | 只看该作者
要想修改连接问题,你必须十分熟悉编译器的各项规定以及对应的芯片各项空间配置等。

如果不太清楚,就不要轻易修改连接文件,尽量使用编译器已经提供的连接文件。

使用特权

评论回复
13
keal224324|  楼主 | 2013-7-31 10:01 | 只看该作者
本帖最后由 keal224324 于 2013-7-31 10:05 编辑

把我改好以后的工程上传一份吧,这份已经自测无误了。就是减少了可用任务的数量,从原来的10个改为了6个。
如果想使用更多的任务,需要修改LINK文件,就按照原来的方法合并BANK就可以了,只是这样修改以后系统感觉并不稳定,且TASKDEL()函数貌似不能用。我并没有修改LINK文件的这个程序,系统很稳定,调试的现象与预计完全一样。
新手自己摸索,请轻拍。


MyuCOSII_25k80.zip (652.64 KB)

使用特权

评论回复
14
Rain_King| | 2014-5-16 09:57 | 只看该作者
keal224324 发表于 2013-7-31 10:01
把我改好以后的工程上传一份吧,这份已经自测无误了。就是减少了可用任务的数量,从原来的10个改为了6个。
...

楼主还在否....能不能解答一下几个问题呢...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

37

帖子

2

粉丝