Holtek C Compiler V3 FAQ
Holtek C Compiler V3 FAQ
Notice
1. This document may be not the latest version. As Holtek's tools and documents will continue to be updated, some
dialog boxes and tool descriptions in actual use may differ from the contents of this document. For the most up-
to date information, visit the Holtek website at:
http://www.holtek.com.tw/en/mcu_tools_users_guide
2. It is assumed that the reader already has the following basic qualities:
• Knows how to write C programs
• Has already read and understood the target MCU datasheet
Table of Contents
Part I V3 Introduction.......................................................................................... 5
1.1 V3 Version...............................................................................................................................5
1.2 What are the increased functions in the new version..............................................................5
1.3 What are the V3 user’s guides?..............................................................................................6
1.4 What are the MCUs that V3 does not support?......................................................................6
1.5 What are extended instructions?.............................................................................................7
Part I V3 Introduction
1.1 V3 Version
A:
Release date V3 Compiler version IDE version
2012/12 C Compiler V3.10 HT-IDE30007.7
2013/10 C Compiler V3.20 HT-IDE30007.8
2014/03 C Compiler V3.30 HT-IDE30007.82
2014/09 C Compiler V3.31 HT-IDE30007.85
2015/01 C Compiler V3.40 HT-IDE30007.86
2015/11 C Compiler V3.41 HT-IDE30007.89
2016/06 C Compiler V3.42 HT-IDE30007.90
2016/12 C Compiler V3.50 HT-IDE30007.93
2017/05 C Compiler V3.51 HT-IDE30007.94
2017/12 C Compiler V3.52 HT-IDE30007.96
2018/07 C Compiler V3.53 HT-IDE30007.97
2018/11 C Compiler V3.54 HT-IDE30007.98
V3.50
• Support bit data type (more details can be obtained in chapter 2.2.11 of the <C Compiler V3
user’s guide>))
• Modify bugs.
V3.42
• Support the function of hardware multiplication and division (when IC has the MDU registers,
more details can be obtained in chapter 2.2.10 of the <C Compiler V3 user’s guide>)
• Modify bugs.
V3.41
• Modify when without the option –Os, part of MCUs fail to write EEPROM
• Modify bugs
V3.40
• Modify all known bugs of V3.31
• Optimize the RAM space allocation of extended instruction MCU, more details can be obtained
in chapter 10.1 of <C Compiler V3 user’s guide>
V3.31
• Support for when the entry function and the main function are in different files.
• Modify bug – run error when the function parameter is const array
• Supports the internal function: GCC_DELAY(n), more details can be obtained in chapter 2.2.3 of
the <C Compiler V3 user’s guide>
V3.30
• Supports to specify the program entry function, more details can be obtained in chapter 2.2.9 of
the <C Compiler V3 user’s guide>
• Modify the startup function to avoid the use of the TABRD instruction
• Causes an error when a function parameter type is missing
V3.20
• Supports floating/double data type and C Standard libraries
• Supports MCUs that have extended instructions, such as the HT66F70A
• Supports const variable to specify address, more details can be obtained in chapter 2.2.7 of the
<C Compiler V3 user’s guide>
• Supports function to specify address, more details can be obtained in the <C Compiler V3 user’s
guide> section 2.2.8
MCU name
HT45F2Y HT46R46 HT48E30 HT66F03M
HT45R04 HT46R46-H HT48F06E HT66F03T3
HT45R0G HT46R47-H HT48F10E HT66F13
HT45R34 HT46R48A HT48F30E HT66F20
HT45R35 HT46R51 HT48R002 HT66F23D
HT45R35V HT46R52 HT48R003 HT66F30
HT45R36 HT46R53 HT48R005 HT66FB30
HT45F39 HT46R54 HT48R006 HT66FU30
HT46C22 HT46R71D HT48R01A HT68F002
HT46R22 HT46R71D-1 HT48R02 HT68F003
HT46C46E HT46R72D-1 HT48R063 HT68F03
HT46R46E HT46R72D-1A HT48R063B HT68F03C
HT46C47 HT46R73D-1 HT48R064 HT68F03M
HT46R47 HT46R73D-1A HT48R064B HT68F03T3
HT46C47E HT46R74D-1 HT48R064D HT68F13
HT46R47E HT46RU22 HT48R064G HT68F20
HT46C48AE HT46R92 HT48R07A-1 HT68F30
HT46R48AE HT48C05 HT48R08A-1 HT68FB30
HT46C62 HT48R05A-1 HT48R09A-1 HT68FU30
HT46R62 HT48C06 HT48R52 HT82J97A
HT46F46E HT48R06A-1 HT48R52A HT82J97E
HT46F47E HT48C062 HT48R53 HT82K72A
HT46F48E HT48R062 HT48RA0-5 HT82M39
HT46R002 HT48C10-1 HT48RA0-6 HT82M39B
HT46R003 HT48R10A-1 HT49C10-1 HT82M72A
HT46R003B HT48C30-1 HT49C30-1 HT82M98
HT46R02 HT48R30A-1 HT49R30A-1 HT82M99A
HT46R004 HT48CA0 HT49C30L HT82M99E
HT46R005 HT48RA0A HT49CA0 HT82M99AE
HT46R01A HT48CA0-1 HT49RA0 HT82M99EE
HT46R064 HT48RA0-1 HT49RA0-6 HT83020
HT46R064B HT48CA0-2 HT49R10A-1 HT83F10
HT46R064D HT48RA0-2 HT56R22 HT83F20
HT46R064G HT48CA0-3 HT56R62 HT83F40
HT46R12A HT48RA0-3 HT66F002 HT83F60
HT46R32 HT48CA6 HT66F003 HT83F80
HT46R321 HT48E06 HT66F03 HT83P00-1
HT46R322 HT48E10 HT66F03C HT83R00
2.1 What are the syntax differences between V3 and V2 compared with V1, V2 and
standard C?
A: The syntax differences between V3 and V2 are absolute address variables, interrupt syntax and
integrated assembler. More details can be obtained in the user’s guide <C Compiler V3 user’s guide>
section 2.2
The comparison table for V3, V2, V1 and C are in the user’s guide <C Compiler V3 user’s guide>
chapter 4.
4.3 error (L1038) “RAM (bank0 ) overflow, memory allocation fails for section ….”
A: For without extended instruction architecture MCUs, the C Compiler will assign the variables to
RAM bank0 (extended instruction MCUs can assign the variables to any bank automatically) by
default. When bank0 is full, RAM bank 0 overflows and the following message will be generated:
• Check the data type is correct or not, especially the programs from V1 C Compiler
• If it is a multiple RAM bank MCU, locate the global variables to other banks manually - refer to 3.1
4.4 error (L1038) “ROM/RAM (bank*) overflow, memory allocation fails for section
….”
A: When there is not enough ROM or RAM space, the solution is as follows:
• Check if the optimised parameter -Os is enabled or not, refer to the <C Compiler V3 user’s
guide> section 2.1.4
• Delete unnecessary programs.
4.6 warning (L3009): Same sub function exists between ISR(04H) CMG and MAIN
CMG: _func
A: Exist the same sub function(_func) between the interrupt service routine (04H) and the main function,
solution:
• Avoid the common calling
More details can be obtained in chapter 2.2.1 of <C Compiler V3 user’s guide>
5.3 Solution for when variables are cleared to 0 after a program reset?
A: IDE7.8 version supports a way in which variables are not initialized: the option “Uninitialized global/
static…” does not need to be checked.
5.5 For MCUs which have an EEPROM write limitation (need to write “set wren, wr,
flag” continuously), how to use V3 to write to the EEPROM?
A:
i: In V3, _rden and _rd are in bank1, using extended instructions, is different from the specification
described in the datasheet.
ii: For this function that has strict requests to instructions, it is recommend to use the internal
assembler for its implementation. This is because it is not confirmed that, if C language is used, it
will translate the programs is in a specific way.
iii: To get consecutive instructions, the program in V3 should be changed as follows:
5.6 Notes for assigning a variable to a bit flag using the V3 Compiler
Example:
unsigned char flag;
_pa2=flag;
The asm code: not:
CLR PA2 SZ _flag
SZ _flag JMP L1
SET PA2 CLR PA2
JMP L2
L1:
SET PA2
L2:
Description:
The compiler is only interested in the results of the calculation process, to reduce the output of
instructions, the compiler will translate the left instructions.
C and assembly language are different, a statement not only translation of an instruction, so before
the end of the statement is executed, the calculation is not complete.
Impact:
No matter what the value of the flag is, PA2 will be the first CLR, if an interrupt occurs and the
interrupt is useful to the PA, it will affect the results.
Solution:
• Disable the interrupt before assigning to a bit flag, then enable it at the end of the calculation
More generally:
For calculation of a multi-byte variable, if an interrupt is useful to it, before calculation unfinished
are allowed to enter an interrupt.
5.10 Notes for using the table read in the ASM files of mixed language program
If a project has C file and ASM file, then the EMI flag should be clear during the table read in the
ASM file .For example:
clr emi
tabrd r0
inc tblp
mov a,tblh
…
set emi
5.12 How to solve when modifying the const values in other ways (such as
programming), the result of execution unchanged?
Example:
__attribut__((at(0x400)))
const unsigned char array[] = {0,1,2,3,4,5,6,7};
Clear the area 400H~410H when programming, then execute temp=array[7]; the result of temp is 7.
Solution:
Define array[] and temp = array[7]; in different C files.
5.14 The address of the absolute address variable is occupied by other variables
If the absolute address variable is not used in the program, linker will assign other variables to this
address.
6.1 Variables debug messages cannot be seen on the watch window after using the
V3 optimization parameters?
A: When using optimization parameters, variables may be deleted during optimization, therefore they
will not be shown in the debug messages. To view the variable values when debugging, the variables
can be defined as volatile temporarily, then deleted when debug is complete, such as:
volatile int i, j, k;
6.2 For interrupts and the general function access of the same global variable are
the related statements of this global variable optimized?
A: There is no call relationship between the general function and interrupt. The compiler does not know
when the interrupt occurs so it will influence the variables in the general function. Therefore it is
recommend to define this kind of variables as volatile, such as:
Flag is used in the interrupt ISR_INT0 and the main function, then to define it as volatile:
volatile unsigned char flag;
Description: volatile: a type specifier. Designed to qualify the variables which are accessed or
modified by different functions. Variables defined using volatile cannot be omitted
because of compiler optimization.
Variables recommended to be defined with volatile: special registers, variables used in the interrupt
functions, variables defined for some certain function codes (such as a delay function)
b. Several statements are translated into the same code, but only one line number is shown.
In this case, it may affect debug, but the execution results are without errors. If it is not in above two
cases, then report.
6.5 How to solve the problem when code which is used for delay is optimized when
using the V3 compiler?
A: As follows:
6.6 How to deal with the situation when inline assembly is optimized?
Example:
asm(“mov %0,a”:”=m”(i));//asgn the ACC register to i.
The variable i is unused in the following calculation, so the statement is optimised by the compiler.
After compiled:
Solution:
Use the volatile keyword:
asm volatile (“mov %0,a”:”=m”(i));
6.7 When select the optimization parameters , the delay time is changed?
A: The execution time of the delay function depends on the numbers of instructions executed. When
select the optimization parameters, the instruction is reduced and then affect the delay time. The
program developers should pay attention to this and adjust the delay function,or use the built-in
function GCC_DELAY(n).