?? timer_queue.c
字號:
//----------------------------------------------------//
//-------Institute Of Computing Technology-----------//
//------------Chinese Academic Science---------------//
//-----中國科學院計算技術研究所先進測試技術實驗室-----//
//----------------------------------------------------//
/**
* @copyright:nbicc_lpp
* @this is timer queue header
* @author liulingyi (lingyiliu@ict.ac.cn)
*
* @data:2005.11.19
* @version:0.0.1
* @updata:$
*
*/
#include "timer_queue.h"
//#include "mac.h"
//#include <avr/sfr_defs.h>
//各函數定義
void timer3queue_init(Timer_Queue_pointer queue_head)//初始化函數,主要用于設置好T1定時器的比較寄存器和分頻系數,比較寄存器設為0xffff.并初始化隊列第一個元素。
{
// queue_head=NULL;
}
extern uint8_t Timer3_adjustInterval(uint16_t interval);
extern uint32_t Timer3_acquireInterval(uint16_t interval);
extern void Timer3_sethalfsymbol(uint16_t symbols);
extern void Timer3_intDisable(void);
//extern Timer_Queue_pointer head_of_timer_queue;
//NOTE:只支持16位定時
//有返回值,主要是因為沒有把queue_head設成全局變量
//傳遞進來的queue_head可能被修改
Timer_Queue_pointer timer3queue_start(Timer_Queue_pointer queue_head, BYTE timertype, BYTE framedsn, BYTE timer_reason, WORD ticks)//開始一個新的定時任務,主要功能是將當前任務插入到定時隊列中,并設置好相應的值
{
//往定時隊列中插入一個新的定時任務,需要設置定時隊列元素的各結構域
Timer_Queue_pointer temp;
Timer_Queue_pointer p_temp1,p_temp2;
DWORD compare_reg;
temp=(Timer_Queue_pointer)malloc(sizeof(struct TimerM_timer_queue));
temp->next=NULL;
temp->timer_reason=timer_reason;
temp->timer_type=timertype;
temp->framedsn=framedsn;
if(queue_head==NULL)
{
//if()
Timer3_sethalfsymbol(ticks);
compare_reg=(((uint32_t)ticks)<<1);
//if(compare_reg)
temp->ticks=(uint16_t)((compare_reg>65535)? (compare_reg-65535):compare_reg);
temp->ticksLeft=compare_reg;
queue_head=temp;
//printf("\n***the ticks is %08x\n",temp->ticks);
//printf("\n***the ticksleft is %08lx\n",temp->ticksLeft);
}
else
{
//插入到定時隊列中去,按temp->ticks的順序
compare_reg=Timer3_acquireInterval(ticks);
temp->ticks=(uint16_t)((compare_reg>65535)? (compare_reg-65535):compare_reg);
temp->ticksLeft=compare_reg;
p_temp1=queue_head;
p_temp2=queue_head;
while((p_temp2!=NULL)&&((temp->ticksLeft)>(p_temp2->ticksLeft)))
{
p_temp1=p_temp2;
p_temp2=p_temp1->next;
}
if(p_temp2!=queue_head)
{
p_temp1->next=temp;
temp->next=p_temp2;
}
else
//為頭節點,需要調整物理定時器
{
Timer3_adjustInterval(temp->ticks);
temp->next=queue_head;
queue_head=temp;
}
}
return queue_head;
}
//傳遞進來的queue_head可能被修改
Timer_Queue_pointer timer3quere_cancel(Timer_Queue_pointer queue_head, BYTE framedsn,BYTE timer_reason)//取消一個定時任務
{
//依據取消的framehandle,如果是隊列頭,則需要重新設置比較寄存器的值,否則只需把它從隊列中摘掉即可。
Timer_Queue_pointer p_temp1,p_temp2,p_temp3;
p_temp1=queue_head;
p_temp2=queue_head;
p_temp3=queue_head;
//printf("\ntimer head->framedsn is %d----\n",queue_head->framedsn);
if(timer_reason!=WAIT_FOR_RESPONSE)
{
while(((p_temp2->framedsn!=framedsn)||(p_temp2->timer_reason!=timer_reason))&&(p_temp2!=NULL))
{
p_temp1=p_temp2;
p_temp2=p_temp2->next;
}
}
else
{
while((p_temp2->timer_reason!=timer_reason)&&(p_temp2!=NULL))
{
p_temp1=p_temp2;
p_temp2=p_temp2->next;
}
}
if(p_temp2==NULL)
error("\ncannot find an element in the timer_queue\n");
else
{
p_temp3=p_temp2->next;
if(p_temp2==queue_head)
{
if(p_temp2->next==NULL)
{
//printf("\n\n");
Timer3_intDisable();
//printf("\ntimer3 is disabled\n");
}
else
{
//重新設置定時器
Timer3_adjustInterval(p_temp3->ticks);
}
//取下head節點,釋放空間
queue_head=p_temp3;
free(p_temp2);
}
else
{
p_temp1->next=p_temp3;
free(p_temp2);
}
}
return queue_head;
}
//調用的MAC.h中的函數,進行相應的處理。
extern void mac_timer_task(void);
extern void timerqueue_adjust(void);
extern uint16_t mac_timer3queue_getnextinterval(void);
uint16_t timer3queue_getnextinterval(void)
{
return mac_timer3queue_getnextinterval();
}
void timer3queue_interrupt(void)
{
timerqueue_adjust();
OS_post(mac_timer_task);
}
//T1時鐘中斷服務程序。當比較寄存器設置的值和計數器當前值相等時候,產生中斷服務程序。
/*void __attribute((interrupt)) __vector_12(void)
{
//硬件寄存器的設置,以及定時隊列的處理,重新設置比較寄存器。暫時不摘掉隊列頭元素,作為參數進行傳遞,在mac_timer_task中進行摘除
//調用mac_timer_task開始進行處理,通過post任務的形式調用。
}
*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -