timer
概述
Timer,即通用硬件定時器。 該組件是Timer VFS驅(qū)動子系統(tǒng),給應(yīng)用或組件提供通過VFS形式(open/close/ioctl)訪問硬件Timer驅(qū)動對上層提供服務(wù)的接口。該組件初始化過程中,會根據(jù)hardware/chip/<chip_name>/package.yaml中定義的CONFIG_TIMER_NUM來依此創(chuàng)建如下名稱的設(shè)備節(jié)點(diǎn):
/dev/timer0
/dev/timer1
...
/dev/timer[CONFIG_TIMER_NUM - 1]
組件支持以下功能:
設(shè)置定時器運(yùn)行周期
設(shè)置中斷回調(diào)函數(shù)
啟動/停止定時器
版權(quán)信息
Apache license v2.0
目錄結(jié)構(gòu)
.
├── example
│ └── timer_example.c #Timer示例代碼
├── include
│ ├── aos
│ │ └── hal
│ │ └── timer.h #Timer HAL API申明
│ └── vfsdev
│ └── timer_dev.h #Timer設(shè)備API申明
├── package.yaml #編譯和配置文件
├── README.md #使用文檔
└── src
└── timer_dev.c #Timer設(shè)備實現(xiàn)代碼
依賴組件
base # 最底層核心驅(qū)動模型、驅(qū)動自動加載機(jī)制以及Device VFS core
vfs # VFS API抽象庫
常用配置
本組件可以通過CONFIG_TIMER_NUM配置對上層提供設(shè)備節(jié)點(diǎn)的數(shù)量,CONFIG_TIMER_NUM代表芯片內(nèi)部的硬件定時器控制器的數(shù)量。 CONFIG_TIMER_NUM默認(rèn)是在hardware/chip/<chip_name>/package.yaml中的define節(jié)點(diǎn)進(jìn)行配置。 如果沒有定義CONFIG_TIMER_NUM,則代碼中會定義默認(rèn)對外輸出的設(shè)備節(jié)點(diǎn)數(shù)量。
設(shè)備節(jié)點(diǎn)數(shù)量:默認(rèn)4個, 如需修改,在hardware/chip/<chip_name>/package.yaml中修改CONFIG_TIMER_NUM配置
define:
CONFIG_TIMER_NUM: 1
API說明
打開設(shè)備節(jié)點(diǎn)
int open(const char *pathname, int flags);
args | description |
pathname | 硬件定時器外設(shè)VFS路徑 |
flags | 目前固定為0值 |
兼容POSIX標(biāo)準(zhǔn)的open接口。其中參數(shù)pathname為/dev/timer加硬件定時器外設(shè)ID,例如/dev/timer0。
關(guān)閉設(shè)備節(jié)點(diǎn)
int close(int fd);
兼容POSIX標(biāo)準(zhǔn)的close接口。
設(shè)置定時器參數(shù)
在需要設(shè)定硬件定時器的定時及超時處理函數(shù)的時候呼叫此API
int ioctl(int fd, IOC_TIMER_IRQP_SET, unsigned long arg);
// arg為指向timer_alarm_t結(jié)構(gòu)體的指針
// 如需設(shè)定周期為500ms的周期性定時器,并在硬件定時器到期后呼叫timer_handler(argument_pointer),代碼如下:
timer_alarm_t ralarm;
alarm.arg = argument_pointer; // 呼叫定時器到期處理函數(shù)的時候傳入的參數(shù)
alarm.cb = timer_handler; // 定時器到期處理函數(shù)指針
alarm.period = 500000; // 單位:ms
alarm.auto_reload = true; // 開啟自動重新加載硬件定時器功能
ioctl (fd, IOC_TIMER_IRQP_SET, &ralarm);
獲取定時器當(dāng)前設(shè)定參數(shù)
在需要獲取硬件定時器的當(dāng)前的定時參數(shù)的時候呼叫此API
int ioctl(int fd, IOC_TIMER_IRQP_GET, unsigned long arg);
// 示例代碼
timer_alarm_t ralarm;
ioctl (fd, IOC_TIMER_IRQP_GET, &alarm);
開啟/停止定時器
int ioctl(int fd, IOC_TIMER_CONTROL, unsigned long arg);
// arg為IO_TIMER_START代表開啟定時器, 示例代碼:
ioctl (fd, IOC_TIMER_CONTROL, IO_TIMER_START)
// arg為IO_TIMER_STOP代表停止定時器
ioctl (fd, IOC_TIMER_CONTROL, IO_TIMER_STOP)
控制定時器是否自動重新加載
int ioctl(int fd, IOC_TIMER_RELOAD, unsigned long arg);
// arg為true代表開啟自動重載定時器功能, 示例代碼:
ioctl (fd, IOC_TIMER_RELOAD, true)
// arg為false代表停止自動重載定時器功能, 示例代碼:
ioctl (fd, IOC_TIMER_RELOAD, false)
使用示例
組件使用示例相關(guān)的代碼下載、編譯和固件燒錄均依賴AliOS Things配套的開發(fā)工具,所以首先需要參考《AliOS Things集成開發(fā)環(huán)境使用說明之搭建開發(fā)環(huán)境》,下載安裝。 待開發(fā)環(huán)境搭建完成后,可以按照以下步驟進(jìn)行示例的測試。
步驟1 創(chuàng)建或打開工程
打開已有工程
如果用于測試的案例工程已存在,可參考《AliOS Things集成開發(fā)環(huán)境使用說明之打開工程》打開已有工程。
創(chuàng)建新的工程
組件的示例代碼可以通過編譯鏈接到AliOS Things的任意案例(solution)來運(yùn)行,這里選擇helloworld_demo案例。helloworld_demo案例相關(guān)的源代碼下載可參考《AliOS Things集成開發(fā)環(huán)境使用說明之創(chuàng)建工程》。
步驟2 添加組件
案例下載完成后,需要在helloworld_demo組件的package.yaml中添加對組件的依賴:
depends:
- timer: master # helloworld_demo中引入timer組件
步驟3 下載組件
在已安裝了的開發(fā)環(huán)境工具欄中,選擇Terminal -> New Terminal啟動終端,并且默認(rèn)工作路徑為當(dāng)前工程的workspace,此時在終端命令行中輸入:
aos install timer
上述命令執(zhí)行成功后,組件源碼則被下載到了./components/drivers/peripheral/timer路徑中。
步驟4 添加示例
在timer組件的package.yaml中添加example示例代碼:
source_file:
原有其他文件
- example/timer_example.c # add timer_example.c
步驟5 編譯固件
在示例代碼已經(jīng)添加至組件的配置文件,并且helloworld_demo已添加了對該組件的依賴后,就可以編譯helloworld_demo案例來生成固件了,具體編譯方法可參考《AliOS Things集成開發(fā)環(huán)境使用說明之編譯固件》。
步驟6 燒錄固件
helloworld_demo案例的固件生成后,可參考《AliOS Things集成開發(fā)環(huán)境使用說明之燒錄固件》來燒錄固件。
步驟7 打開串口
固件燒錄完成后,可以通過串口查看示例的運(yùn)行結(jié)果,打開串口的具體方法可參考《AliOS Things集成開發(fā)環(huán)境使用說明之查看日志》。
當(dāng)串口終端打開成功后,可在串口中輸入help來查看已添加的測試命令。
步驟8 測試示例
CLI命令行輸入:
timer_example id
其中ID取值范圍:[0, CONFIG_TIMER_NUM)
關(guān)鍵日志
vfs timer test success, ret:0
注意事項
無
FAQ
無