我使用的单片机型号是STC8G1K08A,在此单片机上移植了MultiTimer库,这是我很喜欢的一个类似任务管理的低占用库。
该库地址如下(我使用的是位于master分支的老版本)0x1abin/MultiTimer at master (github.com)
国内访问镜像链接:MultiTimer: 软件定时器 - Gitee.com
该库有一个链表。我刚开始在Data区进行开发时,一切运行良好,直到将默认变量位置改到Xdata区,如图:
然后业务逻辑就运行异常,经过一个多小时的痛苦排查,发现问题和XDATA区有关。
该库的链表代码如下:
经过我的尝试,这样修改后仍然无法正常运行。包括keil配置回使用默认DATA区,然后显式声明xdata。
另附我这边的定时器配置(我使用库函数开发)
初始化:
- void Timer_Config(void){
- TIM_InitTypeDef TIM_InitStructure; //结构定义
-
- //定时器3做16位自动重装, 中断频率为100HZ
- TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T; //指定时钟源, TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
- TIM_InitStructure.TIM_ClkOut = DISABLE; //是否输出高速脉冲, ENABLE或DISABLE
- TIM_InitStructure.TIM_Value = 65536UL - (MAIN_Fosc / (100*12)); //初值
- TIM_InitStructure.TIM_PS = 0; //8位预分频器(n+1), 0~255, (注意:并非所有系列都有此寄存器,详情请查看数据手册)
- TIM_InitStructure.TIM_Run = ENABLE; //是否初始化后启动定时器, ENABLE或DISABLE
- Timer_Inilize(Timer1, &TIM_InitStructure); //初始化Timer
- NVIC_Timer1_Init(ENABLE, NULL); //中断使能, ENABLE DISABLE 无优先级
-
复制代码
ISR:
- void Timer1_ISR_Handler (void) interrupt TMR1_VECTOR //进中断时已经清除标志
- {
- timer_ticks();
- }
复制代码
特向各位大佬请教!!!多谢各位大佬!
|