Holtek Semiconductor的HT67F50段显示驱动中断定义
Holtek Semiconductor's HT67F50 segment display driver interrupt definition
我正在尝试使用 HT-IDE3000 编写中断例程,但是当我在例程中编写一些代码时,链接器给出了关于 RAM bank0 溢出的错误。我正在使用 Holtek C Compiler V3,用户指南说中断向量定义必须按照 void __attribute((interrupt(0x24))) TIM0_ISR(){}
而不是旧版本 #pragma vector TIM_ISR @0x24
然后它在 Holtek C Compiler V3 第 34 页说 "The variables that can be accessed by both the interrupt service routine and other functions are defined as volatile"用户指南,我的代码是;
#include "HT67F50.h"
typedef struct
{
/*volatile*/ uint8_t time2msflag:1;
/*volatile*/ uint8_t t500msflag:1;
/*volatile*/ uint8_t t1sflag:1;
/*volatile*/ uint8_t poweronflag:1;
const /*volatile*/ uint8_t reserved:4;
}Flag_t;
volatile uint8_t time2ms;
volatile uint8_t t500ms;
volatile uint8_t t1s;
volatile uint16_t time1s_dis;
volatile Flag_t flag;
void __attribute((interrupt(0x24))) TIM_ISR(void)
{
//_t0af = 0;
//if (++time2ms >= 2)
//{
//time2ms = 0;
//flag.time2msflag = 1;
//if (flag.poweronflag)
//{
//if (++time1s_dis >= 1000) // power on and all pixels illuminated for 2s
//{
//time1s_dis = 0;
//flag.poweronflag = 0;
//}
//}
//else
//{
//if (++t500ms >= 250)
//{
//t500ms = 0;
//flag.t500msflag = ~(flag.t500msflag); // second flash
//if (++t1s >= 2)
//{
//t1s = 0;
//flag.t1sflag = 1;
//}
//}
//}
//}
}
当我取消注释行时,链接器的输出是;
Holtek (R) Cross C Compiler Version V3.4
Compiling D:\x-yedek\calismalar\holtek\termo\termo\driver\lcd_config.c ...
Holtek (R) Cross-Assembler Version HGASM0202
Copyright (C) 2002 Holtek Semiconductor INC. All rights reserved.
D:\x-yedek\calismalar\holtek\termo\termo\lcd_config.ASM
0 Errors, 0 Warnings
Linking...
Error(L1038) : RAM bank0 overflow, memory allocation fails for section '_rfmSendAck' (size 09H) in the file 'D:\x-yedek\calismalar\holtek\termo\termo\RFM69HC.OBJ'
Unallocated DATA Section List:
Class Length Name
DATA 0 [0h] _adcMainConfig
DATA 0 [0h] _adcChipInit
DATA 0 [0h] _adcCalibration
DATA 0 [0h] _adcRead
DATA 9 [9h] _portInputInit
DATA 4 [4h] _setPins
DATA 4 [4h] _resetPins
DATA 2 [2h] _getPins
DATA 5 [5h] _togglePin
DATA 1 [1h] _setPortAWakeUp
DATA 1 [1h] _setPotyAWakeUpMulti
DATA 1 [1h] _resetPortAWakeUp
DATA 1 [1h] _resetPotyAWakeUpMulti
DATA 3 [3h] _spiInit
DATA 7 [7h] _spiReadMulti
DATA 5 [5h] _rfmInit
DATA 1 [1h] _rfmSetAddress
DATA 1 [1h] _rfmNetworkAddress
DATA 7 [7h] _rfmSendData
DATA 9 [9h] _rfmSendAck
DATA 0 [0h] _rfmSetHighestPower
DATA 5 [5h] _encryption
DATA 0 [0h] _builtin_holtek_dtnorm
DATA 0 [0h] _builtin_holtek_dtinf
Total 1 error(s), Total 0 Warning(s)
'termo' - Total 1 error(s), 0 warning(s)
我通过在 0x80h 和 0xFFh 之间的 ram bank0 创建常用变量解决了这个问题,添加了一个 ram bank0 地址定义并更改了变量创建行;
#define RAM_BANK0 0x80
static volatile uint8_t time2ms __attribute__((at(RAM_BANK0)));
static volatile uint8_t t500ms __attribute__((at(RAM_BANK0 + 1)));
static volatile uint8_t t1s __attribute__((at(RAM_BANK0 + 2)));
static volatile uint16_t time1s_dis __attribute__((at(RAM_BANK0 + 3)));
static volatile Flag_t flag __attribute__((at(RAM_BANK0 + 5)));
我正在尝试使用 HT-IDE3000 编写中断例程,但是当我在例程中编写一些代码时,链接器给出了关于 RAM bank0 溢出的错误。我正在使用 Holtek C Compiler V3,用户指南说中断向量定义必须按照 void __attribute((interrupt(0x24))) TIM0_ISR(){}
而不是旧版本 #pragma vector TIM_ISR @0x24
然后它在 Holtek C Compiler V3 第 34 页说 "The variables that can be accessed by both the interrupt service routine and other functions are defined as volatile"用户指南,我的代码是;
#include "HT67F50.h"
typedef struct
{
/*volatile*/ uint8_t time2msflag:1;
/*volatile*/ uint8_t t500msflag:1;
/*volatile*/ uint8_t t1sflag:1;
/*volatile*/ uint8_t poweronflag:1;
const /*volatile*/ uint8_t reserved:4;
}Flag_t;
volatile uint8_t time2ms;
volatile uint8_t t500ms;
volatile uint8_t t1s;
volatile uint16_t time1s_dis;
volatile Flag_t flag;
void __attribute((interrupt(0x24))) TIM_ISR(void)
{
//_t0af = 0;
//if (++time2ms >= 2)
//{
//time2ms = 0;
//flag.time2msflag = 1;
//if (flag.poweronflag)
//{
//if (++time1s_dis >= 1000) // power on and all pixels illuminated for 2s
//{
//time1s_dis = 0;
//flag.poweronflag = 0;
//}
//}
//else
//{
//if (++t500ms >= 250)
//{
//t500ms = 0;
//flag.t500msflag = ~(flag.t500msflag); // second flash
//if (++t1s >= 2)
//{
//t1s = 0;
//flag.t1sflag = 1;
//}
//}
//}
//}
}
当我取消注释行时,链接器的输出是;
Holtek (R) Cross C Compiler Version V3.4
Compiling D:\x-yedek\calismalar\holtek\termo\termo\driver\lcd_config.c ...
Holtek (R) Cross-Assembler Version HGASM0202
Copyright (C) 2002 Holtek Semiconductor INC. All rights reserved.
D:\x-yedek\calismalar\holtek\termo\termo\lcd_config.ASM
0 Errors, 0 Warnings
Linking...
Error(L1038) : RAM bank0 overflow, memory allocation fails for section '_rfmSendAck' (size 09H) in the file 'D:\x-yedek\calismalar\holtek\termo\termo\RFM69HC.OBJ'
Unallocated DATA Section List:
Class Length Name
DATA 0 [0h] _adcMainConfig
DATA 0 [0h] _adcChipInit
DATA 0 [0h] _adcCalibration
DATA 0 [0h] _adcRead
DATA 9 [9h] _portInputInit
DATA 4 [4h] _setPins
DATA 4 [4h] _resetPins
DATA 2 [2h] _getPins
DATA 5 [5h] _togglePin
DATA 1 [1h] _setPortAWakeUp
DATA 1 [1h] _setPotyAWakeUpMulti
DATA 1 [1h] _resetPortAWakeUp
DATA 1 [1h] _resetPotyAWakeUpMulti
DATA 3 [3h] _spiInit
DATA 7 [7h] _spiReadMulti
DATA 5 [5h] _rfmInit
DATA 1 [1h] _rfmSetAddress
DATA 1 [1h] _rfmNetworkAddress
DATA 7 [7h] _rfmSendData
DATA 9 [9h] _rfmSendAck
DATA 0 [0h] _rfmSetHighestPower
DATA 5 [5h] _encryption
DATA 0 [0h] _builtin_holtek_dtnorm
DATA 0 [0h] _builtin_holtek_dtinf
Total 1 error(s), Total 0 Warning(s)
'termo' - Total 1 error(s), 0 warning(s)
我通过在 0x80h 和 0xFFh 之间的 ram bank0 创建常用变量解决了这个问题,添加了一个 ram bank0 地址定义并更改了变量创建行;
#define RAM_BANK0 0x80
static volatile uint8_t time2ms __attribute__((at(RAM_BANK0)));
static volatile uint8_t t500ms __attribute__((at(RAM_BANK0 + 1)));
static volatile uint8_t t1s __attribute__((at(RAM_BANK0 + 2)));
static volatile uint16_t time1s_dis __attribute__((at(RAM_BANK0 + 3)));
static volatile Flag_t flag __attribute__((at(RAM_BANK0 + 5)));