NEC Electronics (China) NEC ELECTRONICS (CHINA)
日电电子 NEC
主  页
应  用
产  品
技  术
支  持
购  买
最  新  消  息
关  于  我  们
header
产品名称搜寻
关键字搜寻
文档搜寻
参数搜寻
    网页指南  联系我们  

FAQ



 CC78K
内容    
FAQ-ID = 78cc-nnnn
0001: F861 无 EXT_TABLE 定义输出
0002: 启动程序设置对话框变暗并且不能执行设置
0003: 看上去0x0080的标识得到了扩展。
0004: 输出文件名字设定方法是什么?
0005: 如何在 CC78K0 的复位之后使程序从相同的地址重启?
0006: 是否有一种方法可以将函数实体放置到指定的位置?
0007: 我想在 gap 区域中放置一段程序,该如何实现? [CC78K0]
0008: 如何指定 SFR 区的各种寄存器的各个位?
0009: 如何用编译器来保护中断堆栈?
0010: 在C语言中如何使用宏服务?
0011: 当浮点计算溢出的时候,会产生怎样的结果值?
0012: 如果在浮点除法中进行被0除的运算,会产生怎样的结果值?
0013: 浮点除法(fdiv)返回的最大值是多少?
0014: 是否支持双精度浮点运算? [CC78K4]
0015: 关于外部数组变量的外部声明发生的错误。
0016: 在中断中保存工作区域
0017: 库函数的重入特性 [CC78K4]
0018: 当一个24位的地址空间被访问的时候输出了这样的错误提示"ERROR F304 操作超出范围"。
[CC78K4]
0019: 链接时输出了这样的错误提示"A402 文件没有符号的字符串表"。
0020: 链接的时候输出了这样的错误提示"F304 操作超出范围"。
0021: 链接的时候多次出现了这样的错误提示"F405 未定义符号 '@@xxxx'"
0022: 当程序数量增加的时候出现了这样的错误提示"F112 临时文件中有太多内部节点"。
0023: 当CC78K 版本升级的时候出现了这样的链接错误提示"段 @@RTARGO 不能定位在内存区"。
0025: 当CC78K 版本升级的时候出现了这样的链接错误提示"W417 在文件 xxxxxx 中的 RA78K
的版本超过一个"
0026: 当CC78K 版本升级的时候出现了这样的链接错误提示(@@RTARG0 区域分配图)
0027: 78K/4 的链接定位的范围必须包括 RAM 中的 SFR区域吗?
0028: 当 CC78K 版本升级的时候出现了这样的错误提示"F702 太多 callt 函数"
0029: 编译产品中包括一个汇编器吗?

78cc
-0001
F861 无 EXT_TABLE 定义输出
问1 当我增加一个-zf选项,并且执行编译操作产生一个下载到内部 flashFROM 的程序文件时, 报错"F861 无 EXT_TABLE 定义输出";
怎样才能避免这个情况的发生?
答1 -zf选项只用于创建那些支持内部 flashROM 自我编程的程序时。
要使用 flash 编程器制作写到内部 flashROM 的程序,请将-zf选项设置为关闭状态。
78cc
-0002
启动程序设置对话框变暗并且不能执行设置
问1 我想设置项目管理器中编译器选项设置对话框的启动程序,但是这个设置选项已经变暗,不能被设置。
答1 当项目管理器(PM32 项目窗口)左侧窗口中的任何一个源文件被选中的时候, 针对设置个体来源选项的模式被启用,结果启动程序不能设置。
为了取消源文件名的选择,点击不同于源文件名的部分文件, 然后完成编译器选项的设置。
78cc
-0003
看上去0x0080的标识得到了扩展。
问1 当我编译下面这些源程序时,产生了额外的不同的代码。

[源文件]
  typedef unsigned short USHORT;
  #define MASK7   0x0080

  sreg USHORT usVar7;
       usVar7 += ~MASK7;

[产生的代码]
  Original source:     usVar7 += ~MASK7;
  Expected generation: usVar7 s usVar & 0xFF7F
  Actual generation:   usVar7 s usVar & 0x007F
答1 因为在默认情况下,-qc选项是允许的, #define MASK7 0x0080被当作一个char型的常数0x80来处理,并产生了这样的结果。

你可以这样写来预防这个问题
  #define MASK7 ((unsigned short)0x0080).
(参考)
在CC78K0S操作用户手册中有描述-Q选项的部分。
78cc
-0004
输出文件名字设定方法是什么?
问1 当用项目管理器进行汇编时,装载模块(.lmf)文件名成为第一次编译的文件名。
这个文件名可以设置吗?
答1 通过设置链接器选项是可行的。
在项目管理器菜单目录中 , 点击 "Option (O)", 然后从下拉式菜单中选择"Linker Option Setting (L)" 。
屏幕然后换成选项设置屏幕(Output 1),这样,你就可以设定你想要在输出文件名字域中设定的文件名了。
78cc
-0005
如何在 CC78K0 的复位之后使程序从相同的地址重启?
问1 在程序执行过程中,我想让程序能够象硬件复位一样从头开始运行。
是否可以用C语言进行描述?
答1 不能用C语言描述。
你需要用汇编指令执行下面这些操作。
      MOVW  AX,!0
      PUSH  PSW
      PUSH  AX
      RETI
通过运行这些指令,你能够分枝到复位矢量的地址并从初始位置执行程序。
78cc
-0006
是否有一种方法可以将函数实体放置到指定的位置?
问1 对于存储器定位,我想用 C 语言定义实体, 但是这些实体没有被放在指定的序列之内。
这个问题有好一点的解决方法吗?
答1 没有更好的方法,如果你想要指定区域,请用汇编来定义实体而不是C语言, 用"_"开始符号的定义,并将其声明为公共符号。
对于C,从符号名称中去掉"_",并声明为外部符号。
78cc
-0007
我想在 gap 区域中放置一段程序,该如何实现? [CC78K0]
问1 查看 MAP 文件时,会发现从3CAH 到 800H 的区域是 gap 区域。
我想把一个程序加入到这个空的区域。
在向 3CAH 开始的地址区域布置代码之前,我做了如下的描述
这样会发生问题吗?
#pragma section @@CODE ROM
答1 我们不推荐这样使用,但这并不会产生问题。
为了使用段落说明,我们推荐将其描述成
#pragma section @@CODE CODE 1
并定义
merge CODE1: AT (3CAH)
并在链接指令文件中指定。
78cc
-0008
如何指定 SFR 区的各种寄存器的各个位?
1 如何指定 SFR 寄存器中每一个位? (例如,启动/停止 TM1 或者 TM2 定时器。)
答1 为了启动 TM1 定时器,可以这样写
TCE1 = 1
或者这样写
TMC1.0 = 1

为了停止 TM1 定时器,可以在 TM1 中写0替代1。
针对 TM2,可以用写 TCE2 替代 TCE1,并使用 TMC1.1 替代 TMC1.0。
78cc
-0009
如何用编译器来保护中断堆栈?
问1 CC78K0 扩展功能包括中断功能。
如果不用堆栈切换说明,编译器能否保护所需要的堆栈大小?
答1 CC78K0 不能保护堆栈区域,并且只能使用默认堆栈区域
78cc
-0010
在C语言中如何使用宏服务?
1 在C语言中如何使用宏服务?
答1 基本上,C语言中不支持宏服务。
如果处理器不能及时的执行任务,这时可以使用宏服务。
但是C语言并不适合这种实时操作的情况。
我们推荐使用汇编语言完成这样的程序。

另外,你可能要做的工作是将宏服务通道定义为一个结构体,并将其定位在 saddr1 区。
相关的控制字及这些地址并没有由编译器保留下来,必须在程序中定义。
然后,你只需为这些在结构体中定义的变量设置一些值就可以了。
78cc
-0011
当浮点计算溢出的时候,会产生怎样的结果值?
问1 当浮点/浮点计算结果溢出时,从函数返回的值是最大值吗?
还是只是一个错误代码?
答1 函数中返回的值是无穷大和无穷小之中的一个。
此外,matherr 被调用,并且 ERANGE(=2) 被设置到 errno。
78cc
-0012
如果在浮点除法中进行被0除的运算,会产生怎么样的结果值?
问1 当执行被0除的操作时,返回的是什么值?
1 根据被除数不同而产生不同的结果。除了允许的数值之外,也包括有争论的输入组合, 最后的计算结果如下。
  \除数
被除数\
不是一个数无穷大0正常的数
不是一个数不是一个数不是一个数不是一个数不是一个数
无穷大不是一个数不是一个数无穷大无穷大
0不是一个数0不是一个数0
正常的数不是一个数0无穷大x/y
78cc
-0013
浮点数除法(fdiv)返回的最大值是多少?
问1 浮点数除法(fdiv)返回的最大值是多少?
是10的38次方吗?
答1 是的。
在用户手册中"表 2-3 基本类型列表"有关于浮点值范围的描述,返回值必然在这个范围内。
78cc
-0014
是否支持双精度浮点运算? [CC78K4]
问1 如果在 CC78K4 浮点除法期间,发生除数下溢,或是被0除, 在程序运行期间发生溢出错误(+INF)。
能够通过将除数和被除数改变成双精度来避免吗?
答1 不可以,这是不现实的。
在 CC78K4 中不支持双精度浮点数运算。
因此,在完成除法之前,首先确定除数不是0,然后再执行除法。
78cc
-0015
关于外部数组变量的外部声明发生的错误。
问1 我想读用 C 语言定义一个在分开的文件中的数组的表格数据。
像如下方法声明这个数组
  int const aa[3] = {0, 1, 2};
并按照如下方式读取
  extern int aa;
  int a, b;
  a = 2;
  b = aa[a];
当在一个分开的文件中使用这个数组的时候,声明方式是怎样的?
答1 声明像外部数组这样定义的变量,类型的匹配是必须的。
因此,在这个案例中,需要执行如下语句来声明数组变量。
  extern int aa[3];
78cc
-0016
如何在中断中保存工作区域?
问1 当执行库函数的时候,发生了一个中断,并且当试图运行库函数的时候,产生了一个意想不到的程序循环。
当使用库函数时,执行中断要注意些什么吗?
(这个工作区域是被自动保存的吗?)
答1 不止是 saddr 区域需要保存,寄存器也需要保存。
这取决于中断函数是如何定义的。

例如,如果寄存器工作区被指定给一个中断函数,不执行寄存器保存。
而如果用于主函数的寄存器工作区被错误地指定,那么寄存器的内容就会被破坏。

对于保存的信息的类型,可以参阅语言手册中的 "第11章 扩展功能"里面的章节" (10) 中断功能"其中的"表11-13 使用中断功能时的保存/恢复区"

此外,程序是否为可重入功能也是一个问题。
关于这一点,在语言手册中"第10章 库函数"中的"10.3 重入"的描述中,函数是不可重入的。
所以,在主程序中,如果函数处于正在执行期间,而中断处理时执行了同样的函数, 那么这个程序就不能正确的工作了。
问2 是否有使用库函数的指示?
2 重点是使用并选择了什么类型的模式(普通还是静态)。
获取更多的信息,请参阅语言手册中"第10章 库函数"的开始部分。
78cc
-0017
库函数的重入特性 [CC78K4]
问1 在CC78K4中,如何链接才能满足下列条件?
因为支持浮点数的 sprintf 没有可重入特性,
我想为 sprintf 链接不支持浮点的项目。

我应该按照cl4.lib, cl4f.lib的顺序来链接吗?
- 我想使 sprintf() 具有重入性
- 不指定浮点例如sprintf()中的%f
- 不使用sscnaf, scanf, vprintf, vsprintf
- 使用 log10() 这样浮点型函数
1 如果你想要使用像 log10() 这样的浮点型函数,必须要按照cl4f.lib, cl4.lib的顺序链接。

理由:
假定一个函数 sub() 被用于如下的调用关系。
somefunc() -> sub() 不支持浮点
log10() -> sub() 支持浮点型
当 cl4.lib 首先被链接,并且使用 somefunc() 和 log10()时,不支持浮点操作的 sub() 属性被链接, log10() 因而可能无法正常操作。

当 cl4f.lib 首先被链接,而支持浮点操作的 sub() 包括了不支持浮点操作的说明,
这样就不会有问题了。

为了防止将来会出现的问题,最好通过获得它的库源程序(CC78K4-L),并在你的源文件中将其 和不支持浮点的 sprintf() 相关源程序合并起来。
在这种情况下,有必要检查所使用的浮点函数源程序,例如log10(), 并且确定没有使用如上面描述的 sub() 这样的调用函数。
如果这样的函数已经被使用了,那么就改变相应 sub() 的函数名来排除不需要的影响。
78cc
-0018
当一个24位的地址空间被访问的时候输出了这样的错误提示"ERROR F304 操作超出范围"。[CC78K4]
问1 我想通过C语言程序来访问一个24位地址空间(!!addr24)的数据
我应该怎样来写这段程序?
当前,在链接的时候发生了下面这些错误提示
*** ERROR F304 操作超出范围(segment'@@CODE',address xxxxH,type'!addr16')
编译时,我使用的是中模式(-MM).
答1 使用大模式(-ML)替代中中模式。 
在中模式情况下,只支持64K的数据空间。
因此,中模式不能访问一个超过64K空间的数据。
如果想要访问64K或者更大空间的数据,使用一个大模式,就不会有这样的限制了。
78cc
-0019
链接时输出了这样的错误提示"A402 文件没有符号的字符串表"。
1 当执行汇编时,在链接期间出现下面这样的报错提示。
*** ERROR A402 文件 'xxxxxx.REL' 没有表征程序失败的字符串表。
1 这个错误表明符号表已经被破坏。
有几个可能的原因,但请首先检查以下几点。

(1) 如果在C中使用嵌入式的汇编,请检查那些不是以?L开头定义的局部变量。
(2) 检查超过24个字符的函数名。
如果有这样的描述,请改变符号名。
78cc
-0020
链接的时候输出了这样的错误提示"F304 操作超出范围"。
问1 编译或者链接好之后提示如下错误信息
*** F304 操作超出范围 (segment '@@CODE', address xxxxH,type 'saddrp')
1 当试图将太多的变量定位在 saddr 区域(FE00 to FF1F)时, 所需要的区域超出了 saddr 的范围,这样错误就发生了。
saddr 区域是固定的不能增加的区域。
请校正位于 saddr 区域的变量。
此外,因为在编译阶段无法知道是否会溢出 saddr 区域,因而不会有错误输出, 溢出会在链接时发生,从而输出错误信息。
78cc
-0021
链接的时候多次出现了这样的错误提示"F405 未定义符号 '@@xxxx'"
1 在使用 uPD780053 编译和汇编的时候都没有出错,但是当链接的时候出现如下错误。
  *** ERROR F405 未定义符号 '_@RTARG0' 在文件 'BURNER.REL'
  *** ERROR F405 未定义符号 '@@iumul' 在文件 'INT.REL'
  *** ERROR F405 未定义符号 '_@RTARG0' 在文件 'INT.REL'
  *** ERROR F405 未定义符号 '_@RTARG2' 在文件 'INT.REL'
  *** ERROR F405 未定义符号 '_@RTARG4' 在文件 'INT.REL'
  *** ERROR F405 未定义符号 '_@RTARG6' 在文件 'INT.REL'
  *** ERROR F405 未定义符号 '_@RTARG0' 在文件 'TIME.REL'
  *** ERROR F405 未定义符号 '@@iumul' 在文件 'TIME.REL'
答1 这些符号是在库和启动程序中被定义。
检查这些提供应用函数的库(例如 cI0.lib)是否被链接。
如 CC78K0 用户手册中"2.2.2 库文件"里面描述的文件,都有提供操作说明。

同样,检查开始程序(例如, s0r.rel)的链接。
启动程序定义了处理,符号,等以启动一个C程序。
只要没有替代的程序被创建,那么这个启动程序就需要被链接。
78cc
-0022
当程序数量增加的时候出现了这样的错误提示"F112 临时文件中有太多内部节点"。
问1 当程序(变量等等)增加的时候,输出如下错误。

F112 临时文件中有太多内部节电。编程失败。

通过分割这个C代码,我能够预防这个错误的发生,但是我还是不懂为什么会发生这样的错误。
程序长度大约3500行。
答1 如果 -sa 或者 -a 选项被指定,那么问题很有可能是由输出到汇编源模块文件的长度限制引起的。
78cc
-0023
当CC78K 版本升级的时候出现了这样的链接错误提示"段 @@RTARGO 不能定位在内存区"。
问1 CC78K0 版本升级(V3.0 -> V3.1)时,下面的链接错误是对一个正确程序的编译过程中出现的。

*** 段 "@@RTARGO" 不能定位在内存区。"

这个错误是发生在多次操作数超出范围错误之后。
答1 作为升级的结果,@@RTARGO 的定义方法已经改变, 需要实际分配到存储区的部分已经提高,但是所用的链接指示描述中没有所需要的存储空间, 所以需要8位区域的 @@RTARGO 就没地方放置了,最终造成了上述的错误。

在指示描述中加入一个用于放置 @@RTARGO 的8位区域。
78cc
-0025
当CC78K 版本升级的时候出现了这样的链接错误提示"W417 在文件 xxxxxx 中的 RA78K 的版本超过一个"
问1 出现下面的错误

ERROR W417 在文件'D:\NECTOOLS\LIB\CL4.LIB'中的RA78K 的版本多于1个。
文件'xxxxxx\CSTARTRN.REL'中使用第一个。
答1 这只是一个警告,指示用于创建库的版本不同于用于汇编启动程序的版本。
用于编译器的汇编器的版本在手册中或者附录中有描述,所以请检查一下这个信息。
问2
*** ERROR F108 存储区 'ROM' 和 'rom' 重叠 *** ERROR F108 存储区 'RAM' 和 'ram' 重叠
答2 这指示链接指示文件说明不正确。
这个错误意味着已经定义为 ROM,RAM 的区域重新被定义为不同的名字rom,ram。
请使用相同的名字(包括大小写)重新定义 ROM,RAM。
问3
*** ERROR F304 操作超出范围 (segment 'CODE03', address xxxxH, type 'saddrg1') *** ERROR F304 操作超出范围 (segment 'CODE03', address xxxxH, type 'saddrg1')
答3 只有这些信息,我无法说明什么地方出错。
查阅汇编列表,计算出距开始处的偏移量(F5B 从MAP文件开始),然后找到有疑问的指令。
此时,被指定为 saddrg1 的操作数并不是 saddrg1,这个事实就是原因所在。
78cc
-0026
当CC78K 版本升级的时候出现了这样的链接错误提示(@@RTARG0 区域分配图)
问1 在 CC78K0 升级(V3.0 -> V3.1)之后,发生了一个链接错误(sol.elk)。
答1 观察链接指示文件,存储区并没有分配到FEB8H之下的地址。
  memory SDR:   (0FE60H, 058H)
因为这个区域是由 @@RTARG0 所用的,存储区不能分配到这个区域,因而发生了错误。
(在早先的3.0版,只是简单的使用 EQU 定义,不会发生错误,但是在3.1版中, 需要的区域被定义,因而发生了错误。)

作为对策,拓宽上述的说明以使这个区域变为存储区,可以通过下面语句实现:
  memory SDR: (0FE60H, 0A0H)
在这个例子中,到 FEFFH 是保护区域。
78cc
-0027
78K/4 的链接定位的范围必须包括 RAM 中的 SFR区域吗?
问1 当使用下列针对 LK78K4 的链接指示时,输出错误信息。
  memory ROM :(0, 0EE00H)
  memory RAM :(0EE00H, 1100H)
答1 首先,RAM 区域的定义存在问题。
78K4中,RAM 必须包括 SFR 区域。
在你询问的设置中,定义的只是 SFR区 域之前的直接地址。
从 1100h 到 1200h 改变RAM大小。
我相信这个问题首先引起F111错,然后是F304错误。
78cc
-0028
当 CC78K 版本升级的时候出现了这样的错误提示"F702 太多 callt 函数";
1 在所有的 _callt 函数定义的地方出现了这样的错误"F702 太多的 callt 函数" 
共使用了 32个callt 函数。
答1 关于你的询问,这个问题是由于这个版本 CC78K0 的规定已经改变。
在新的 CC78K0 版本中,callt 被用于优化性能。

结果,能够被用户使用的 callt 函数就受到了限制。
根据下面的 -QL 选项,可以被用户使用的 callt 函数受到控制。
-QL 选项 -QL1-QL2-QL3-QL4
普通模式 31 29 9 0
静态模式 32 28 19 10
78cc
-0029
编译产品中包括一个汇编器吗?
1 78K0x C编译器中包括汇编器吗?
答1 不包括。
汇编器是另外一个软件包的一部分,因此,需要单独购买。



   LEGAL    最新之产品资料, 请参阅英文版
 请用Internet Explorer浏览本网站以达最佳效果。
  © 2005-2008  NEC Electronics China Limited