原创 (转)ARM经典300问--5

2008-11-23 22:51 3150 6 6 分类: MCU/ 嵌入式
第 158 问:  

Q:在看 uc/os-II 的书时,关于 ucos-II 中任务切换的几种情况的问题.  


1.在一个时钟周期内,至少所有的任务都要运行一遍,对吗


2.任务切换发生的三种情况:  


a.任务 A 主动放弃 CPU 的主动权,利用  OSTimeDly()  延时,进行任务切换;  


b.中断时钟周期发生时,在任务就绪表中寻找最高优先权的任务,如果当前任务不是最高优先级,发生任务切换,否则仍执行原任务;  


c.发生 irq,fiq,软中断,取指错误和取数据错误五种异常模式时,直接发生任务


切换,  中断处理结束后,在任务就绪表中寻找最高优先权的任务,如果当前任


务不是最高优先级,发生任务切换,否则仍执行原任务.  


A:1.不一定,如等信号时  OSPend(x, 0, &err)时.  


2.只有在 IRQ,FIQ 和软中断受 OS 管理时才能进行任务切换,同理取指,取数异常在启动阶段的    死循环根本谈不上任务切换.  


第 159 问:  


Q:请问:在移植 UC/OS 中的软件中断汇编接口程序中取功能号码.原程序为:  


如果是在 THUMB 状态,则为 LDR R0,[LR,#-2]  


如果是在 ARM 状态,  则为 LDR R0, [LR, #-4],  


在清除 R0 中的最高两位,R0 的值就为功能号.  


为什么是从 LR 中取值呢  LR 的值是进入中断时候保存的 PC 值吗迷惑!   


A:执行 SWI 指令后,处理器进入管理模式,LR_svc 中保存返回地址,顺藤摸瓜,根据 LR_svc 就可以取得 SWI 语句,也就取得了中断号.  


 第 160 问:  


Q:请问及各位高手:OSIntCtxSw()函数分别在 includes.h 和 OS_CPU_A.s 中有定义,区别在哪程序 OSIntExit 中调用该函数的时候是不是都是去调用了 includes.h 中的宏定义的那个两者各自的应用范围在哪儿  我看过一个移植实例上只有一个 OSIntCtxSw 函数.请指教!  


A:includes.h 中的宏  OSIntCtxSw  在 C 中被调用.  


  


第 161 问:  


Q:问一个堆栈指针的问题


在 OSIntCtxSw_1,获取新任务堆栈指针.  


LDR R4, [R6]  


ADD SP, R4, #68 ;17 寄存器


CPSR,OsEnterSum,R0-R12,LR,SP  


LDR LR, [SP, #-8]  


MSR CPSR_c, #(NoInt | SVC32Mode) ;进入管理模式


MOV SP, R4 ;设置堆栈指针


 LDMFD SP!, {R4,R5} ;CPSR,OsEnterSum  


;恢复新任务的 OsEnterSum  


......  


 我想问一下:LDR LR, [SP, #-8],这一行程序中,为什么堆栈指针要减去 8 个字节的值


A:这是调整 SP 的指针,使其指向栈中的 LR.看一看配套《ARM 微控制器基础与实战》的图6.3.    


Q:ucos 中断丢失.  


在 ucos 在每秒切换 200 次时正常,但在 1000 次时中断丢失   可能是哪里的问题


A:问题已经找到,是随 2104 中的 ucos 不支持中断嵌套.在不嵌套时 4000 次/秒也是正常的.  


 第 162 问:  


Q:uC/OS-II 能在 2104 上和用户程序一起编译吗    一定得分开编译吗


《ARM 微控制器基础与实战》上介绍的移植方法上是分开编译的,我想合并在一起调试, 这样就不必用软件中断去寻找系统函数的入口地址.要做到这样,是不是只需把OS_TASK_STAT_EN 设置为 1,OS_SELF_EN 为 0  


A:可以,网站上有例子 http://www.zlgmcu.com/tools/kaifaban/EasyARM2104.asp.


 第 163 问:  


Q:请教:我运行 OSInit();  函数,程序死在 SoftwareInterrupt B SoftwareInterrupt  困惑呀!  


A:uc/osii 的启动代码与普通的启动代码不同,您使用的是普通的启动代码.  


 第 164 问:  


Q:请问:在 UC/OS-II 目录中的 README.TXT 下,有的例子说:"仅 lpc2106 有足够的 RAM 可以在 RAM  中放入所用代码."那么,如果我使用 LPC2104,在 FLASH 中存放运行代码是否能正常运行谢谢!  


A:主要看数据是否超出 16k,如果超出,请减少任务占用的堆栈.  


 第 165 问:  


Q:请问:在 UCOS-II\ex2_arm 中,我编译时出现错误提示如下:  


ERROR:L6221E:execution region ER_R0 overlaps with Execution region ER_ZI.  如何解决    而我在 UCOS-II\ex1_arm 中编译.运行都正常,谢谢!  


A:定义任务堆栈小一点,如"#define TASK_STK_SIZE 128"  


 第 166 问:  


Q:uCOS-II\EX2_arm 我什么也不动,用 ADS 打开,可是编译的时候出错,是很多文件找不到.   比如 ucos_ii.h 就找不到.  


#include "..\..\source\ucos_ii.h"  


可是我的光盘里没有 source 这个文件夹啊,还有很多 uCOS-II 文件也找不到,是不是我的光盘少了东东站上有得下载吗


A:要将 uC/OS-II(v2.52)源代程序放到 source 目录下,北航出版的 uC/OS-II 书(第二版) 带有.  


 第 167 问:  


Q:OSIntNesting(嵌套层数)和 OsEnterSum(关中断计数器),有什么区别吗


我个人认为这两个变量相同,不知为什么要定义两个变量


A:OsEnterSum  是关中断的计数器,目的是实现临界段嵌套.  


OSIntNesting  是中断嵌套层数,目的是实现中断嵌套.  


 第 168 问:  


Q:为何我 EX1_FLASH 移植的时候总出现如下错误提示,请问是哪里出错了


Error : C2933E: type disagreement for 'OSTaskStkInit'  


Os_cpu_c.c line 70  


A:是调用 OSTaskStkInit 时类型不一致导致,好好看一下 C 语言.  


 第 169 问:  


Q:请问:在 SWI 软中断指令中,LR 中放的是异常模式下的返回地址,而这个地址的低 8 位和低 24 位分别是 thumb 和 ARM 指令下的立即数,这种对应的关系是如何来的还有执行 THUMB 和 ARM 指令,LR 中放的地址最后的位应是 0 和 00,那么为什么会有


swi 01  


swi 03  


这样的立即数呢


A:您的理解不对,可以看一看 os_cpu_s.s 这个文件.  


 第 170 问:  


Q:2104,2119 中都不能用 UCOSII 的 flag 的问题.  


在模板中 ARM Executable Image for UCOSII(for lpc21xx)加入这个程序文件.实际上程序运行到  KeyFlagGrp = OSFlagCreate(KeyFlags,KeyFlagErr);  时就进入 Startup.s 的取数据终止,但在没模板的情况下是没问题的,请问哪位在模板中用过 UCOSII 的flag  


A:字节对齐问题,请在事件标志结构定义前加__packed.  


第 171 问:  


Q:我请教您一个问题,在 2104 里写程序的时候用  malloc()来分配内存单元的时候,经常出现在程序中被分配的单元数值在任务切换的过程中被改变的情况,不知道您碰到过没有是如何解决的谢谢!用 ucos 中的内存分配函数就不回出现这种问题.   


A:请在网上下载最新的模板,其中启动代码有更新.  


另外,如果分配太大的空间可能会造成程序跑飞.  


 第 172 问:  


Q:在 uC/OS 中进入临界代码区时,只是关 swi 中断,还是将所有的中断都关断.  


A:要关所有调用了 OS 系统服务函数的中断.一般是 IRQ 中断.  


  


第 4 章 芯片


第 173 问:  


Q:2100  实验板的问题.  


使用几次 RelInFLASH 后不能正常工作,包括其他两种方式也不能工作在 RelInFLASH 和DeBUGinflash 时显示一个错误


Warnning! interrupt vectors data is not correct!  


Program you downloaded can not run freely!  


不知怎么回事 使用 DebugInRAM 虽然不报错,但无法正常工作.  


A:可能是启用了加密功能引起的,使用 ISP 擦除 FLASH.  


 第 174 问:  


Q:很有意思,自从买了 2100 实验板一直在用 DebugInRAM,今天想试试 DebugInFLASH,后来就选了后者进行调试,奇怪的现象发生了,以后再进行 DebugInFLASH 之前确切的说是进入 AXD 在运行之前都显示着我第一次用 DebugInFLASH 时下装的程序,一运行就可以显示当前程序的结果,每次如此,只要不运行其他程序,实验板上的 LED 就保持第一次下载的程序的状态,RESET 和重新上电都不行,是不是我的这个程序把开机的 DEMO 替换掉了,哪里可以下载到那个 DEMO,我想再装回去.   A:DebugInFLASH 就已经把程序下载到 FLASH 了,原先出厂的程序已被你的程序覆盖.   


第 175 问:  


Q:我将其按照 intle 32 bit hex 编译后将 hex 文件通过 ISP 下载到 2104 开发板上为什么没有反映    后来再下载 C 语言编写的同样功能的文件,前几次可以运行,后来又下载了别的程序后就又不能运行了,请问这是什么问题多谢!  


A:光盘上的 EINT1_LED.S 只适合于在 RAM 中调试,如果要下载到 FLASH 中运行,需要加入向量表(且要求向量表累加和为 0).  


Reset  


LDR PC, ResetAddr  


LDR PC, UndefinedAddr  


LDR PC, SWI_Addr  


LDR PC, PrefetchAddr  


LDR PC, DataAbortAddr  


DCD 0xb9205f80  


LDR PC, [PC, #-0xff0]  


LDR PC, FIQ_Addr  


 ResetAddr DCD MAIN  


UndefinedAddr DCD Undefined  


SWI_Addr DCD SoftwareInterrupt  


PrefetchAddr DCD PrefetchAbort  


DataAbortAddr DCD DataAbort  


Nouse DCD 0  


IRQ_Addr DCD 0  


FIQ_Addr DCD FIQ_Handler  


MAIN ...  


 第 176 问:  


Q:手册上只有 I1.8,而没有 I3.3,无法计算片子功耗.  


A:3.3V 与外设相关.芯片本身在 3.3V 中的消耗可以忽略不计.  


第 177 问:  


Q:通过查看数据手册 LPC2119 的接地有三种,分别是 Vss(0V 电压参考点),Vssa(模拟地), Vssa_pll (pll 模拟地),三种的电压都为 0V,但为了降低噪声和出错几率需要隔离, 请问如何隔离 电源方面:有两种供电电压,一种是 1.8V(内核),一种 3.3V(I/O 口)


分别存在隔离问题,请问如何解决    吾乃新手,还忘老手不吝赐教,谢谢!  


A:与普通的多种地布线类似(它们有多少种方法就有多少种方法),最终这些地线还是要接到一起.  


第 178 问:  


Q:请问 LPC2119 的电源芯片选哪款较为合适 有没有推荐的匹配


A:与 2104 一样,可选 SPX1117. 


第 179 问:  


Q:我现在数字电路除 LPC2114 使用 3.3V 电压外,其余的大部分是 5V 的.我想先将 LPC2114 连接到  CPLD,再连接到其它电路(CPLD 的 I/O 口可以输出或输入 5V)不知道行不行. 谢谢.  


A:我觉的简单的电路可以用 LVC 芯片,必要时可以用 3V 的 CPLD.  


第 180 问:  


Q:请问:你们公司的 ARM 芯片相对于 象 44B0X  等等一系列的 ARM  处理器的优点在那里好象 LPC2104  还比较的贵啊!现在我正在考虑选择  ARM 芯片的问题,望回答.谢谢


A:我们的 LPC210X 内部有 FLASH 和 RAM,LPC211X 为工业级适用于工控领域,并且是全球唯一可加密    的 ARM.  


以整个系统成本来说,LPC ARM 内部有 FLASH 和 RAM,低功耗,可加密性价比更高.具有ARM 的性    能,单片机的特点,在许多应用场合比其它的 ARM 更优越.  


第 181 问:  


Q:我的 2214 板 IO 口和中断均能正常工作,今天准备调显示器,显示器接在 CS2 上,8 位数据线,通过查资料,得 cs2 的地址空间为 8200 0000,于是我将命令口地址定为 0x82000001,数据口地址定义为 0x8200 0000,对啦,数据命令切换线在 A0 上,在显示器初始化前,对 CS2 进行了配置,即 BCFG2&=0XCFFF FFFF,即除修改成 8 位数据线外,其它均不变,对显示初始,定时送显示器,但是测量 CS2 口线,根本不出现低电平,更不用说数据线啦,即好像外部总线根本没有工作.之后根据 2214 的模板,从新设置了参数,结果写信号出不来,片选,读地址,数据均有.  


PINSEL2=0x0f814910;  


BCFG2&=0xcfffffff; // CS2,8 位数据线,  


请问,配置外部总线还需要其它寄存器吗,由于手上没有这方面的资料,请给予帮助. 谢谢!  


A:注意 BCFG2 的写保护位.  


第 182 问:  


Q:请问:关于 LPC2214 的 BOOT0 和 BOOT1 的用法.  


前提:我使用内部 FLASH 作为程序存储器,利用外部总线 CS0 扩展一片并口的 12 位 AD, CS1 扩展并口的液晶,CS2 扩展一片 RAM 芯片.  


我的想法:将 BOOT0 和 BOOT1 上拉,系统上电启动后,检测到 11,那么从内部 FLASH 启动,之后我可以设置管脚的选择寄存器,使能 CS0 和 CS1 和外部总线,那么我就可以随时的利用它的地址访问我的外部扩展的设备.请问我的想法对吗,并请指点一下我应该注意的相关的问题.  


A:正确.  


 第 183 问:  


Q:请问:2214 外扩 SST39VF320 在 CS1 上为什么读 ID 不正确程序如下:  


//设置 PINSEL2 位


#define P1_26_31_Debug 4 // JTAG D2  


#define P1_16_25_Track 8 //  跟踪  D3  


#define P2_Data_Bus 0x10 // D0-15 IO (D5 D4=01)  


#define P3_27_WE 0x100 //  写信号  D8  


#define P3_26_CS1 0x800 // D11  


#define P3_25_CS2 0x4000  


#define P3_24_CS3 0x10000  


#define P3_0_23_ADDR 0x0f800000 //  地址总线


 


//PINSEL0=P0_0_15_Set;  


#define PIN2Set (P1_26_31_Debug+P1_16_25_Track+P2_Data_Bus+\  


P3_27_WE+P3_26_CS1+P3_25_CS2+P3_24_CS3+P3_0_23_ADDR)  






#define SST39VF320_Com_Add1 (*((volatile unsigned long *) 0x81005555))  


#define SST39VF320_Com_Add2 (*((volatile unsigned long *) 0x81002aaa))  


#define SST39VF320_ID1_Add (*((volatile unsigned long *) 0x81000000))  


44


 


#define SST39VF320_ID2_Add (*((volatile unsigned long *) 0x81000001))  


 


void InitGPIO()  


{  


PINSEL2=PIN2Set;  


BCFG1=0x10000000; // 16 位


}  


 void Check320(void)  


{  


SST39VF320_Com_Add1=0xaa;  


SST39VF320_Com_Add2=0x55;  


SST39VF320_Com_Add1=0x90;  


// Delay_150_Nano_Seconds();  


// Read the product ID from 39VF320  


SST_id1=SST39VF320_ID1_Add; //  读出 ID 不对


SST_id2=SST39VF320_ID2_Add; //  读出 ID 不对


SST39VF320_Com_Add1=0xaa;  


SST39VF320_Com_Add2=0x55;  


SST39VF320_Com_Add1=0xF0;  


}  


A:CPU  的 A0 不能不能接,另外地址也要相应的变化(针对 FLASH 的地址和针对 CPU 的地址不一样).  


 第 184 问:  


Q:请问 1.8V 电源和 3.3V 电源的跳线要同时供电吗 分别是给谁供电的


A:一个是给核心(内核)供电,一个是给 I/O 口供电.  


第 185 问:  


Q:1.ARM 的 P0.1(WR),P0.4(RD)为何不直接和以太网控制芯片的 IOWB,IORB 相连NETCS 起什么作用


2.网卡控制芯片的 INT0 为何要接一个反相器和 ARM 的 P0.7 相连


3.  我能否直接连接到 ARM 的 P0.16(外部中断 0 输入)口呢


4.8 位数据线和 5 位地址线怎么实现分时复用


A:1.使用片选选择,NETCS 就是片选信号.  


2.因为 8019 的中断是输出高电平,为了适应所选芯片,所以加反相器.  


3.如果所选芯片支持低电平或跳变触发,就可以不用加反相器而直接与外部中断输入相连.  


4.加锁存器.  


 第 186 问:  


Q:目前 210x 的各功能均试验完毕,现在想知道的是其 IAP 功能是否可以向 PSD 产品那样实现远程的程序更新   如果可以,那么当程序代码写入 FLASH 后如何让程序转到更新后的程序  PSD 是通过寄存器来完成转换的,那么 210x 如何实现呢 比如 210x 的程序是从 0地址开始执行的,假如原代码长 2FFFH,现在更新后的程序长 3500H,那么在 IAP 时只能将代码写到非 00000000~00002FFFH 区域 FLASH 中,写完后该如何让当前程序停止而转到更新后的程序呢  PSD 产品是因为有 2 块存储器,在执行当前存储器中程序时可对另块存储器写操作,写完后在将执行权交给另块存储器.期待您的回复!  


A:如果,你的程序较小(64k),你就把它当作两块独立的 FLASH(多个扇区).  


写入其中一块,另一块空着...  


程序开始执行的时候,判断哪一块是最新的,跳转过去就行了!  


一旦从外界收到"更新程序"的命令,检验数据,更新另外一块,就行了!  


接收完毕,烧写结束,写入最新程序标志.立即跳过去.  


下一次开机,执行最新的.  


这个方法,比较安全.可以防止中途通讯结束,复位等.  


如果你的程序比较大,有点悬……至少,在某些干扰环境下,不要那么做.  


 第 187 问:  


Q:开发板实验中  delay_ns(uint32 dly)  在上述条件下是延时 dly 秒吗如是则执行速度似乎并不    快  怎么估计出来的呢


A:如果程序和数据均在片内 RAM 中,这样计算:  


1.一般指令需 1 个主时钟时.  


2.每次跳转增加 3 个主时钟时间(也许是 2 个,需要确认).  


3.从 RAM 中取一个操作数多增加一个主时钟时间,以此类推.  


4.保存一个结果到 RAM 中多增加一个主时钟时间,以此类推.  


5.访问片内外设,增加一个外设时钟时间.  


注意伪指令 ldr rn,=x 需要从 ram 中取一个操作数.  


第 188 问:  


Q:请问如果 lpc2104 和 5V 的芯片字节连接,中间不接小电阻,会怎样   对系统有没有很大的影响


A:不安全而已.  


 第 189 问:  


Q:2104 的功耗最大在多少,(考虑外设全部工作,功率损耗)  


EASY ARM 板上提供的电源最大输出电流好象只有 300mA 哦.  


A:芯片本身功耗最大值小于 70mA(120 摄氏度,核 2.1V 供电,运行于 60MHz).一般情况小于 50mA.  


IO 口耗电(即 3.3V 耗电)与其它电路密切相关,实质是其它电路在消耗电源(ARM 本身对 3.3V 的消耗是极小的).  


 第 190 问:  


Q:LPC2114 替换 LPC2104 的话,我的程序还需要做哪些变动


哪些内部专用寄存器的地址是否变动


还有,我原来设计电路用的是 LPC2104 的次要 JTAG 口,现在换到 LPC2114 上来,需要怎么改电路

A:程序无需改动,JTAG 设计时在 RTCK  接一个 4.7k 的下拉电阻即可.
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条