1、实战6.4.9 节.第134 问:我将ARM 微控制器基础与实战上uC/OS-II 的第一章例2 移植例在ARM2104 开发版上实现例2 中的TEST.C 中的#define TASK_STK_SIZE 512改为.256,程序编译后,数据量低于16K,能正常运行,但运行时Total Stack不是256 全是1024.另UC/OS-II 书上,第一章例2 每一个任务的堆栈都是512,为什么书上11 页是624,1024,1024,1024,1024,1024,1024,请老师指点,万分感谢!显示的是字节而定义的是字.第135 问:可不可以把所有的任务和相关信号量(二值)在一个任务里面一起创
2、建呢 我现在是这样做的, 不知是不是这方面的原因 而且全部信号量是这样创建的:XX1 = OSSemCreate(0);32XX2 = OSSemCreate(0);XX3 = OSSemCreate(0);一共创建了十个信号量,以前程序代码版本是分开写的执行起来没有问题,不知现在为什么这样写就会出现小问题呢 这样的问题和我的任务和信号里书写位置有关系吗必须在使用信号量前创建信号量.第136 问:UCOS 在中断处理完后调用 OSIntExit(),该函数将判断是不是要进行任务切换,如果是则调用 OSIntCtxSw()切换任务, 然后才恢复寄存器,中断返回.这样说来,在中断返回前,已经切换到
3、别的任务去了,在再次回到被中断的任务前,是不是一直没有中断返回如果进行任务调度,则不会执行OSIntCtxSw()后的语句,相当于中断已退出.第137 问:最近我在学习使用SMALL RTOS 时发现一个 BUG.任务在调用系统等待函数 OSWait(K_TMO | K_SIG,x) 后,不能在延时 x 个 ticks 后被唤醒.我分析了一下原因如下:在 OS_CORE.C uint8 OSWait(uint8 typ, uint8 ticks) small 中,case (K_TMO | K_SIG): 中执行了函数 OSTaskSuspend(OSTaskID);( OS_CORE.C 第
4、549 行)而此函数将延时值改为了 0!解决办法:将此函数改用另一个函数 OS_TaskSuspend(TaskID);并在其后加入任务切换函数 OSSched();便能工作正常.对,这是疏忽,谢谢.您的更改是对的.第138 问:在文件Os_cpu_a.s 中的函数OSIntCtxSw 中有如下语句:(1) LDR R4, R6(2) ADD SP, R4, #6817 寄存器 CPSR,OsEnterSum,R0-R12,LR,SP(3) LDR LR, SP, # -8(4) MSR CPSR_c, #(NoInt | SVC32Mode) ;(5) MOV SP, R4(6) LDMFD
5、 SP!ARM 微控制器基础与实战404 页中解释:只所以要(1)(2)是因为OSTCBHighRdyOSTCBStkPtr 保存的是任务栈位置,而寄存器恢复后堆栈指针并不指向这,所以要调33整新任务堆栈指针. 可是将堆栈指针调整到 新任务入栈的其它数据(见ARM 微控制器基础与实战图6.3)处后,除了取出了LR 以外并没有做 什么,而当执行了(4)后又重新将堆栈指针指向了栈顶(即第(5)句).我认为可以将(2)省去,直接将(3)改为LDR LR, SP, # 60,而当执行完(6)后,堆栈指针就自动指向了新任务入栈的其它数据处.这样修改后我运行了EX1_arm 例子,正常.请问这利用(3)进
6、行堆栈指针调整的原因是什么 不调整可以吗 谢谢.注意不同模式有不同的SP 指针.您这样做会造成内存泄漏,长时间运行会耗尽堆栈而使程序崩溃.第139 问:不明白在光盘上ROMCODE/SRC/下的os_call.c 做什么用.是应用程序与事先固化到flash 中的ucosii 接口的一些代码.在本例中为应用程序如何调用事先 固化到flash 中的ucosii 的OSFlagPend 等函数的接口代码.请看配套ARM微控制器基础与实战的7.4.3 节的第10 点.第140 问:请问在OS_CORE.C 中的常数数组OSUnMapTbl是做什么用的用来计算优先级的,查表计算比较快.第141 问:uc
7、os 的中断嵌套层数是否受到初始化时分配的IRQ 堆栈大小的限制 我的理解是每一次中断需入栈的寄存器有R0-R3,R12,LR,SPSR,共7 个,如果想达到8 层嵌套的话,堆栈长度IRQ_STACK_LEGTH 应设为56,不知这样理解对不对.是,但中断至少占用8 个字,因为c 语言的中断处理函数会将一些数据压入堆栈.要达到8 级嵌套需要的堆栈长度与具体的代码有关.(编者注:新移植代码已有改变)第142 问:请问:核心定时器中断不进入可能因为我的程序在运行一段时间以后,核心定时器中断即操作系统用的Timer0 不能进入,查发现CPSR 的I 位为1,请教这可能是哪个原因估计为开关中断次数不匹
8、配造成.第143 问:GetOSPprioCur()函数应怎样调用 它是一个内核函数吗为什么我在内核和任务分别编译时正常,而合到一起编译时它告警为未定义呢同时我已给您发了一个邮件,请教如何将分别编译的程序合在一起编译的方法,请指教!这是我自己编写的函数,其实就是返回OSPrioCur 的值,请参考MyFunction.c.34第144 问:关于不受uc/os 控制的中断:在ARM 板中,非屏蔽中断可以挂起正在执行的uc/os 任务,除了不能使用uc/os 中的函数外,它的执行工序是不是和受管理的中断一样,先挂起当前任务,再保存CPU 寄存,然后再执行中断ISR,完成后,内核脱离,寄存器恢复,最
9、后任务调度.另外,ARM 微控制器基础与实战中提到不受管理的中断,它的工作是否和非屏蔽中断一样,也可以在uc/os 正执行时发生中断.如果不同,它们是怎样工作最好是象受管理中断一样说明一下它的工作时序!必须比受管理的中断的优先级高,编写方法与没有OS 时中断的编写方法一样.第145 问:不受uc/os-ii 管理的中断和受管理的中断是否具有相同的响应方式,即不受管理的中断在中断 uc/os 正执行的任务后,是不是也是先挂起当前的任务,保存CPU 寄存器,再执行中断子程序,恢复CPU 寄存器,进行最优先级任务的调度.不受uc/os-ii 管理,uc/os-ii 都不知道,还有什么任务调度我知道不
10、受管理的中断不能调用uc/os 的函数,但ARM 微控制器基础与实战上说:FIQ 不受uc/os 管理,但可以用来执行紧急任务,就是说在uc/os 运行时,不受uc/os管理的中断还是可以发生的,它是把整个uc/os 操作系统中止,还是只是中止uc/os 正在执行的任务.不受管理的中断完成后,接着执行什么可以发生,中断整个RTOS.我看了您在lpc210x 上的移植代码,你在说明中说:如果您想通过软件仿真,请将target.c 中的第 51 行屏蔽, 这样就可以看到任务逐个切换,最后将进入空闲任务.我照这做了,但是在单步或者设断点执行时会产生异常,原因是未定义指令OS_ENTER_CRITIC
11、AL()引起的,经过编译的函数都会变成蓝色,但这个函数还是黑色,因为它实际上是一个软中断,请教您如何调试才能看到任务逐个切换 谢谢!1.屏蔽的那一行是死等锁相环锁定,软件仿真时是没有锁相环的.2.黑色是正常的,因为没有定义成函数.3.因为你的 AXD - OPTION - 配置处理器中的 VECTOR CATCH 中的 S 选中了,所以 AXD将你的软件中断当成了异常给捕捉了,取消即可.第146 问:请教ucos2 的源代码中经常碰到:return(void*)0)是什么意思返回空指针.第147 问:这是个什么错误,怎么改啊OsMemPut 是个函数名称Error : L6200E: Symb
12、ol OSMemPut multiply defined (by uCOS_II.o andOs_mem.o).这是重复定义错误.请不要把uCOS_II.C 添加到你的工程中.35第148 问:我想请教一下在配套光盘中有没有ucosII.h 文件,怎么我总是找不到的如没有能否提供下载地方 谢谢!北航出版的第2 版就带有uC/OS 2.52 源代码,还可以到其它网站上找找.第149 问:我想问一下一个任务中的子函数的局部变量算不算进堆栈的容量.我发现我在用邮箱传递一个较大的值时,是在一个任务的函数中声明了uint8byte500,可在传递时值发送了变化,只好用的外部变量了,最后搞得邮箱只起了信号
13、量的作用,所以我觉得局部变量虽然是从堆栈中取得数据,最后在任务切换时,把局部变量也保存到堆栈中,不知道我这种理解是否正确算.局部变量在函数退出后(不管任务是否却换过)被释放.第150 问:我用UCOS 在EASYARM 上的一个程序内编写了5 个任务,前4 个任务调试后工作正常,在编译第5 个任务时,提示为:Execution region ER_RO overlaps with Execution region ER_ZI.编译还提示:TOTAL ROM SIZE (CODE +RO DATA +RW DATA ) 8624我曾经试图修改#define TASK_STK_SIZE 64 也不
14、管用,请问,如何解决问题已找到,代码超过16K.上面的信息会在zi 段或者rw 段与ro 段(代码段)发生重叠时发生.第151 问:请教uc/os 移植问题在2104 上面能进行移植吗 如果不行的话,需要买2106你要在os_cfg.h 中把不用的内部调用都裁减掉,就可以做一个很小的内核,就是不裁减你就是14k 左右,写在FLASH 里一样也能运行.第152 问:请教信号量的概念问题.我准备用信号量来编写一个ARM 程序,但我没有完全理解信号量的概念.例如:现在有4 个任务:TASK1,TASK2,TASK3 和TASK4,任务的要求是:TASK1 和TASK2之间需有信号量传递信息;TASK
15、3 和TASK4 之间需也有信号量传递信息.假定TASK1 和TASK2 之中已建立了一个信号量为RandomSem = OSSemCreate(1);我要问的问题是:TASK3 和TASK4 之中的信号量是否需重新建立一个 例如,加一条36RandomSem1 = OSSemCreate(1);换一个问法:即若TASK1 和TASK2 之间需有信号量传递信息;TASK3 和TASK4 之间需也有信号量传递信息,我只需在运行这4 个任务之前的初始化程序中有一条指令即可:用两个信号量,你第一个说法对了.第153 问:各位:在UCOS 多任务中有一个任务结构如下:void TASK(*pdata)
16、uint8 i;任务循环前的一些指令集A;while(1)任务循环;我要问的是:与该任务有关的初始化,如串口初始化,是否不用放在整个程序的开始处,而作为指令集A 的一部分,也可达到同样效果启动和初始化代码放在一个文件里主要是为了程序的模块化,不过代码少的话倒是可以放在一个函数里完成.ucos 的事件标志使用注意点:请在事件标志结构定义前加_packed,否则由于字节对齐的问题会产生没有反应的bug!第154 问:移植中碰到的问题!我把周工ARM 微控制器基础与实战上的范例1 移植到ARM 上,但任务没有跑起来,请做过移植的朋友帮帮我吧!我是把代码生成HEX 文件全部下到FLASH 中,不知道这
17、样对不对啊 软件需要怎么设置呢先检查ARM Linker 的设置是否正确 参照ARM 微控制器基础与实战P42O 设置release的参数.感觉运行ex1 还是比较容易的,毕竟斑竹都已经把代码写好调试好了,你可以不必完全把它拷贝下来,可以自己建一个project,然后一个个文件添加,这样比较容易弄懂哪些文件都是来干嘛的,哪些还需要自己改写.推荐在建立project 时可以把相应文件分组,我就是把uC/OS2.52 文件放在一个组下,需要自己改写的(如OS_CPU_A.S)放在一个组内,启动代码放在一个组内,自己的代码(如main,自己的任务)放在一个组内,这样比较分明些,个人建议.第155 问
18、:看过操作系统固化之后,有点疑问:37把操作系统和用户代码分开真的能节约RAM 空间吗 只是在用户代码定义的起始地址在0x40000000 的情况下(即调试时)才会节约吧 一般情况下我觉得如果要真正使用的话都应该是把程序起始地址定义到00000000 上的,这样的话才有,不然一掉电程序就没了.这样理解对吗是的,参考合并在一起的例程 ID=861.第156 问:任务间的数据传输除邮箱等外是否可以建立一个全局变量在任务间传递数据!可以,但要注意重入问题和代码优化问题,最好使用volatile 修饰变量,如果不能一次读写完毕则需要加上开关中断的代码.第157 问:uc/os 任务堆栈问题.在ucos
19、 移植的程序EX1_arm 中:#define TASK_STK_SIZE 128#define N_TASKS 10请问,任务堆栈设为什么设这么大可以变小,但要在复杂任务中应保证够用.第158 问:在看uc/os-II 的书时,关于ucos-II 中任务切换的几种情况的问题.1.在一个时钟周期内,至少所有的任务都要运行一遍,对吗2.任务切换发生的三种情况:a.任务A 主动放弃CPU 的主动权,利用 OSTimeDly() 延时,进行任务切换;b.中断时钟周期发生时,在任务就绪表中寻找最高优先权的任务,如果当前任务不是最高优先级,发生任务切换,否则仍执行原任务;c.发生irq,fiq,软中断,
20、取指错误和取数据错误五种异常模式时,直接发生任务切换, 中断处理结束后,在任务就绪表中寻找最高优先权的任务,如果当前任务不是最高优先级,发生任务切换,否则仍执行原任务.1.不一定,如等信号时 OSPend(x, 0, &err)时.2.只有在IRQ,FIQ 和软中断受OS 管理时才能进行任务切换,同理取指,取数异常在启动阶段的 死循环根本谈不上任务切换.第159 问:在移植UC/OS 中的软件中断汇编接口程序中取功能号码.原程序为:如果是在THUMB 状态,则为LDR R0,LR,#-2如果是在ARM 状态, 则为LDR R0, LR, #-4,在清除R0 中的最高两位,R0 的值就为功能号.
21、为什么是从LR 中取值呢 LR 的值是进入中断时候保存的PC 值吗 迷惑!执行SWI 指令后,处理器进入管理模式,LR_svc 中保存返回地址,顺藤摸瓜,根据LR_svc38就可以取得SWI 语句,也就取得了中断号.第160 问:请问及各位高手:OSIntCtxSw()函数分别在includes.h 和OS_CPU_A.s 中有定义,区别在哪程序OSIntExit 中调用该函数的时候是不是都是去调用了includes.h 中的宏定义的那个两者各自的应用范围在哪儿 我看过一个移植实例上只有一个OSIntCtxSw 函数.请指教!includes.h 中的宏 OSIntCtxSw 在C 中被调用.
22、第161 问:问一个堆栈指针的问题在OSIntCtxSw_1,获取新任务堆栈指针.LDR R4, R617 寄存器CPSR,OsEnterSum,R0-R12,LR,SP, R4,R5 ;.我想问一下:LDR LR, SP, #-8,这一行程序中,为什么堆栈指针要减去8 个字节的值这是调整SP 的指针,使其指向栈中的LR.看一看配套ARM 微控制器基础与实战的图6.3.ucos 中断丢失.在ucos 在每秒切换200 次时正常,但在1000 次时中断丢失 可能是哪里的问题问题已经找到,是随2104 中的ucos 不支持中断嵌套.在不嵌套时4000 次/秒也是正常的.第162 问:uC/OS-I
23、I 能在2104 上和用户程序一起编译吗 一定得分开编译吗ARM 微控制器基础与实战上介绍的移植方法上是分开编译的,我想合并在一起调试,这样就不必用软件中断去寻找系统函数的入口地址.要做到这样,是不是只需把OS_TASK_STAT_EN 设置为1,OS_SELF_EN 为039可以,网站上有例子 第163 问:请教:我运行OSInit(); 函数,程序死在SoftwareInterrupt B SoftwareInterrupt 困惑呀!uc/osii 的启动代码与普通的启动代码不同,您使用的是普通的启动代码.第164 问:在UC/OS-II 目录中的README.TXT 下,有的例子说:仅l
24、pc2106 有足够的RAM可以在RAM 中放入所用代码.那么,如果我使用LPC2104,在FLASH 中存放运行代码是否能正常运行 谢谢!主要看数据是否超出16k,如果超出,请减少任务占用的堆栈.第165 问:在UCOS-IIex2_arm 中,我编译时出现错误提示如下:ERROR:L6221E:execution region ER_R0 overlaps with Execution region ER_ZI.如何解决 而我在UCOS-IIex1_arm 中编译.运行都正常,谢谢!定义任务堆栈小一点,如#define TASK_STK_SIZE 128第166 问:uCOS-IIEX2_
25、arm 我什么也不动,用ADS 打开,可是编译的时候出错,是很多文件找不到.比如ucos_ii.h 就找不到.#include .sourceucos_ii.h可是我的光盘里没有source 这个文件夹啊,还有很多uCOS-II 文件也找不到,是不是我的光盘少了东东 站上有得下载吗要将uC/OS-II(v2.52)源代程序放到source 目录下,北航出版的uC/OS-II 书(第二版)带有.第167 问:OSIntNesting(嵌套层数)和OsEnterSum(关中断计数器),有什么区别吗我个人认为这两个变量相同,不知为什么要定义两个变量OsEnterSum 是关中断的计数器,目的是实现临
26、界段嵌套.OSIntNesting 是中断嵌套层数,目的是实现中断嵌套.第168 问:为何我EX1_FLASH 移植的时候总出现如下错误提示,请问是哪里出错了 C2933E: type disagreement for OSTaskStkInit40Os_cpu_c.c line 70是调用OSTaskStkInit 时类型不一致导致,好好看一下C 语言.第169 问:在SWI 软中断指令中,LR 中放的是异常模式下的返回地址,而这个地址的低8 位和低24 位分别是thumb 和ARM 指令下的立即数,这种对应的关系是如何来的还有执行THUMB 和ARM 指令,LR 中放的地址最后的位应是0 和00,那么为什么会有swi 01swi 03这样的立即数呢您的理解不对,可以看一看os_cpu_s.s 这个文件.第170 问:2104,2119 中都不能用UCOSII 的f
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1