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