commit
a0f170b3cf
|
@ -191,8 +191,8 @@ CPU 响应中断并进行处理,通常经历以下过程:保存当前线程
|
|||
## 中断函数接口
|
||||
|
||||
```c
|
||||
typedef void *xs_handler_x(int irq_num, void *arg);
|
||||
xs_int32 xs_RegisterHwIrq(xs_uint32 irq_num, xs_handler_x handler, void *arg, const char *name);
|
||||
typedef void (*IsrHandlerType)(int vector, void *param);
|
||||
int32 RegisterHwIrq(uint32 irq_num, IsrHandlerType handler, void *arg);
|
||||
```
|
||||
该函数用于注册一个中断,当产生中断时,将调用该硬件中断号相应的回调函数进行执行 。
|
||||
| 参数 | 描述 |
|
||||
|
@ -200,9 +200,8 @@ xs_int32 xs_RegisterHwIrq(xs_uint32 irq_num, xs_handler_x handler, void *arg, co
|
|||
| irq_num | 硬件中断号 |
|
||||
| handler | 中断处理回调函数 |
|
||||
| arg | 中断处理回调函数的参数 |
|
||||
| name | 中断名称 |
|
||||
```c
|
||||
xs_int32 xs_FreeHwIrq(xs_uint32 irq_num);
|
||||
int32 FreeHwIrq(uint32 irq_num);
|
||||
```
|
||||
该函数用于释放一个中断。
|
||||
| 参数 | 描述 |
|
||||
|
@ -210,14 +209,14 @@ xs_int32 xs_FreeHwIrq(xs_uint32 irq_num);
|
|||
| irq_num | 硬件中断号 |
|
||||
|
||||
```c
|
||||
xs_int32 xs_DisableHwIrq(xs_uint32 irq_num);
|
||||
int32 DisableHwIrq(uint32 irq_num);
|
||||
```
|
||||
该函数用于屏蔽一个中断。
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| irq_num | 硬件中断号 |
|
||||
```c
|
||||
xs_int32 xs_EnableHwIrq(xs_uint32 irq_num);
|
||||
int32 EnableHwIrq(uint32 irq_num);
|
||||
```
|
||||
该函数用于注使能一个中断。
|
||||
| 参数 | 描述 |
|
||||
|
@ -259,33 +258,112 @@ xs_int32 xs_EnableHwIrq(xs_uint32 irq_num);
|
|||
#### 编程代码清单
|
||||
|
||||
```c
|
||||
#include <xsthread.h>
|
||||
#include <string.h>
|
||||
#include <xshw.h>
|
||||
#include <pin.h>
|
||||
#include <hardware_gpio.h>
|
||||
|
||||
static BusType pin;
|
||||
|
||||
#define GPIO_C2 17
|
||||
#define GPIO_C13 7
|
||||
|
||||
void pin_irqisr(void *args){
|
||||
void PinIrqIsr(void *args){
|
||||
*(volatile *)0x40020818 = 0x2000; /////< GPIO_C13 set high
|
||||
|
||||
*(volatile *)0x4002081a = 0x2000; /////< GPIO_C13 set low
|
||||
}
|
||||
int realtime_irq_test()
|
||||
int RealtimeIrqTest()
|
||||
{
|
||||
int val = 0;
|
||||
int ret = 0;
|
||||
struct PinParam output_pin;
|
||||
struct PinStat output_pin_stat;
|
||||
struct PinParam input_pin;
|
||||
|
||||
xs_PinMode(GPIO_C13, PIN_MODE_OUTPUT);
|
||||
xs_PinMode(GPIO_C2, PIN_MODE_INPUT);
|
||||
struct BusConfigureInfo configure_info;
|
||||
struct BusConfigureInfo configure_info_2;
|
||||
struct BusBlockWriteParam write_param;
|
||||
|
||||
xs_PinWrite(GPIO_C13, PIN_LOW);
|
||||
configure_info.configure_cmd = OPE_CFG;
|
||||
configure_info.private_data = (void *)&output_pin;
|
||||
write_param.buffer = (void *)&output_pin_stat;
|
||||
|
||||
xs_PinAttachIrq(GPIO_C2, PIN_IRQ_MODE_RISING, pin_irqisr, XS_NULL);
|
||||
xs_PinIrqEnable(GPIO_C2, PIN_IRQ_ENABLE);
|
||||
configure_info_2.configure_cmd = OPE_CFG;
|
||||
configure_info_2.private_data = (void *)&input_pin;
|
||||
|
||||
return 0;
|
||||
KPrintf("%s irq test\n",__func__);
|
||||
/* config test pin 1 as output*/
|
||||
output_pin.cmd = GPIO_CONFIG_MODE;
|
||||
output_pin.pin = GPIO_C13;
|
||||
output_pin.mode = GPIO_CFG_OUTPUT;
|
||||
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("config output_pin %d failed!\n", GPIO_C13);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
/* set test pin 1 as high*/
|
||||
output_pin_stat.pin = GPIO_C13;
|
||||
output_pin_stat.val = GPIO_LOW;
|
||||
BusDevWriteData(pin->owner_haldev, &write_param);
|
||||
|
||||
/* config test pin 2 as input*/
|
||||
input_pin.cmd = GPIO_CONFIG_MODE;
|
||||
input_pin.pin = GPIO_C2;
|
||||
input_pin.mode = GPIO_CFG_INPUT;
|
||||
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
if (ret != EOK) {
|
||||
KPrintf("config input_pin %d input failed!\n", input_pin.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
input_pin.cmd = GPIO_IRQ_REGISTER;
|
||||
input_pin.pin = GPIO_C2;
|
||||
input_pin.irq_set.irq_mode = GPIO_IRQ_EDGE_BOTH;
|
||||
input_pin.irq_set.hdr = PinIrqIsr;
|
||||
input_pin.irq_set.args = NONE;
|
||||
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
if (ret != EOK) {
|
||||
KPrintf("register input_pin %d irq failed!\n", input_pin.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
input_pin.cmd = GPIO_IRQ_ENABLE;
|
||||
input_pin.pin = GPIO_C2;
|
||||
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
if (ret != EOK) {
|
||||
KPrintf("enable input_pin %d irq failed!\n", input_pin.pin);
|
||||
return -ERROR;
|
||||
}
|
||||
KPrintf("%s irq test\n",__func__);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int TestRealtime(int argc, char * argv[])
|
||||
{
|
||||
int ret = 0;
|
||||
struct BusConfigureInfo configure_info;
|
||||
|
||||
pin = BusFind(PIN_BUS_NAME);
|
||||
if (!pin) {
|
||||
KPrintf("find %s failed!\n", PIN_BUS_NAME);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin->owner_driver = BusFindDriver(pin, PIN_DRIVER_NAME);
|
||||
pin->owner_haldev = BusFindDevice(pin, PIN_DEVICE_NAME);
|
||||
|
||||
configure_info.configure_cmd = OPE_INT;
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("initialize %s failed!\n", PIN_BUS_NAME);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
RealtimeIrqTest();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -347,31 +425,86 @@ int realtime_irq_test()
|
|||
#### 编程代码清单
|
||||
|
||||
```c
|
||||
static BusType pin;
|
||||
#define GPIO_18 18
|
||||
#define GPIO_19 19
|
||||
|
||||
void pin_irqisr(void *args){
|
||||
void PinIrqIsr(void *args){
|
||||
*(volatile *)0x3800100c |= 0x5;
|
||||
usleep(100);
|
||||
*(volatile *)0x3800100c &= ~0x5;
|
||||
}
|
||||
int realtime_irq_test()
|
||||
{
|
||||
xs_PinMode(GPIO_18, PIN_MODE_OUTPUT);
|
||||
xs_PinMode(GPIO_19, PIN_MODE_INPUT);
|
||||
xs_PinWrite(GPIO_18, PIN_LOW);
|
||||
xs_PinAttachIrq(GPIO_19, PIN_MODE_RISING, pin_irqisr, XS_NULL);
|
||||
xs_PinIrqEnable(GPIO_19, PIN_IRQ_ENABLE);
|
||||
struct PinParam output_pin;
|
||||
struct PinStat output_pin_stat;
|
||||
struct PinParam input_pin;
|
||||
|
||||
struct BusConfigureInfo configure_info;
|
||||
struct BusConfigureInfo configure_info_2;
|
||||
struct BusBlockWriteParam write_param;
|
||||
|
||||
configure_info.configure_cmd = OPE_CFG;
|
||||
configure_info.private_data = (void *)&output_pin;
|
||||
write_param.buffer = (void *)&output_pin_stat;
|
||||
|
||||
configure_info_2.configure_cmd = OPE_CFG;
|
||||
configure_info_2.private_data = (void *)&input_pin;
|
||||
|
||||
/* config GPIO18 as output and set as low */
|
||||
output_pin.cmd = GPIO_CONFIG_MODE;
|
||||
output_pin.pin = GPIO_18;
|
||||
output_pin.mode = GPIO_CFG_OUTPUT;
|
||||
BusDrvConfigure(pin->owner_driver, &configure_info);
|
||||
|
||||
output_pin_stat.pin = GPIO_18;
|
||||
output_pin_stat.val = GPIO_LOW;
|
||||
BusDevWriteData(pin->owner_haldev, &write_param);
|
||||
|
||||
/* config GPIO18 as input */
|
||||
input_pin.cmd = GPIO_CONFIG_MODE;
|
||||
input_pin.pin = GPIO_19;
|
||||
input_pin.mode = GPIO_CFG_INPUT;
|
||||
BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
|
||||
input_pin.cmd = GPIO_IRQ_REGISTER;
|
||||
input_pin.pin = GPIO_19;
|
||||
input_pin.irq_set.irq_mode = GPIO_IRQ_EDGE_RISING;
|
||||
input_pin.irq_set.hdr = PinIrqIsr;
|
||||
input_pin.irq_set.args = NONE;
|
||||
BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
|
||||
input_pin.cmd = GPIO_IRQ_ENABLE;
|
||||
input_pin.pin = GPIO_19;
|
||||
BusDrvConfigure(pin->owner_driver, &configure_info_2);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void realtime_taskswitch_test()
|
||||
int TestRealtime(int argc, char * argv[])
|
||||
{
|
||||
xs_PinMode(GPIO_18, PIN_MODE_OUTPUT);
|
||||
xs_PinWrite(GPIO_18, PIN_LOW);
|
||||
while(1){
|
||||
xs_DelayKThread(1);
|
||||
int ret = 0;
|
||||
struct BusConfigureInfo configure_info;
|
||||
|
||||
pin = BusFind(PIN_BUS_NAME);
|
||||
if (!pin) {
|
||||
KPrintf("find %s failed!\n", PIN_BUS_NAME);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
pin->owner_driver = BusFindDriver(pin, PIN_DRIVER_NAME);
|
||||
pin->owner_haldev = BusFindDevice(pin, PIN_DEVICE_NAME);
|
||||
|
||||
configure_info.configure_cmd = OPE_INT;
|
||||
ret = BusDrvConfigure(pin->owner_driver, &configure_info);
|
||||
if (ret != EOK) {
|
||||
KPrintf("initialize %s failed!\n", PIN_BUS_NAME);
|
||||
return -ERROR;
|
||||
}
|
||||
|
||||
RealtimeIrqTest();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
|
|
|
@ -174,7 +174,7 @@ XiUOS 操作系统提供了独特的内存管理分配算法进行内存管理
|
|||
|
||||
#### 内存初始化
|
||||
```C
|
||||
void xs_SystemHeapInit(void *start_phy_address, void *end_phy_address);
|
||||
void InitBoardMemory(void *start_phy_address, void *end_phy_address);
|
||||
```
|
||||
这个函数用来初始化静态和动态内存。
|
||||
|
||||
|
@ -188,7 +188,7 @@ void xs_SystemHeapInit(void *start_phy_address, void *end_phy_address);
|
|||
|
||||
#### 分配和释放内存
|
||||
```C
|
||||
void *xs_malloc(xs_size_t size);
|
||||
void *x_malloc(xs_size_t size);
|
||||
```
|
||||
这个函数用来分配一块合适大小的内存,如果分配成功,则返回分配内存的首地址;否则返回NULL。
|
||||
|
||||
|
@ -199,7 +199,7 @@ void *xs_malloc(xs_size_t size);
|
|||
</br>
|
||||
|
||||
```C
|
||||
void *xs_realloc(void *pointer, xs_size_t size);
|
||||
void *x_realloc(void *pointer, xs_size_t size);
|
||||
```
|
||||
这个函数用来重新分配一块内存,将原内存块中的数据保存到新的内存中去,并将原内存块释放。如果分配成功,则返回分配内存的首地址;否则返回NULL。
|
||||
|
||||
|
@ -211,7 +211,7 @@ void *xs_realloc(void *pointer, xs_size_t size);
|
|||
</br>
|
||||
|
||||
```C
|
||||
void *xs_calloc(xs_size_t count, xs_size_t size);
|
||||
void *x_calloc(xs_size_t count, xs_size_t size);
|
||||
```
|
||||
这个函数会分配多个内存块并将内存块中的数据初始化为0。
|
||||
|
||||
|
@ -224,7 +224,7 @@ void *xs_calloc(xs_size_t count, xs_size_t size);
|
|||
|
||||
|
||||
```C
|
||||
void xs_free(void *pointer);
|
||||
void x_free(void *pointer);
|
||||
```
|
||||
这个函数用来释放内存。
|
||||
|
||||
|
@ -234,32 +234,10 @@ void xs_free(void *pointer);
|
|||
| pointer | 指向需要被释放的内存 |
|
||||
</br>
|
||||
|
||||
#### 内存钩子函数
|
||||
```C
|
||||
void xs_MallocSetHook(void (*MallocHook)(void *pointer, xs_size_t size));
|
||||
```
|
||||
这个函数设置了一个 MallocHook 函数,MallocHook 函数会在动态内存分配之前调用。
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
| :------ | :------ |
|
||||
| MallocHook | MallocHook 函数指针 |
|
||||
</br>
|
||||
|
||||
```C
|
||||
void xs_FreeSetHook(void (*FreeHook)(void *pointer));
|
||||
```
|
||||
这个函数设置了一个FreeHook 函数, FreeHook 函数会在内存块被释放回动态内存区时调用。
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
| :------ | :------ |
|
||||
| FreeHook | FreeHook 函数指针 |
|
||||
</br>
|
||||
|
||||
#### 其他函数
|
||||
```C
|
||||
void xs_MemoryInfo(xs_uint32 *total_memory, xs_uint32 *used_memory, xs_uint32 *max_used_memory)
|
||||
void MemoryInfo(uint32 *total_memory, uint32 *used_memory, uint32 *max_used_memory);
|
||||
```
|
||||
这个函数用于获取内存的统计信息。
|
||||
|
||||
|
@ -272,14 +250,14 @@ void xs_MemoryInfo(xs_uint32 *total_memory, xs_uint32 *used_memory, xs_uint32 *m
|
|||
</br>
|
||||
|
||||
```C
|
||||
void list_mem(void)
|
||||
void ShowMemory(void);
|
||||
```
|
||||
打印内存信息。
|
||||
|
||||
</br>
|
||||
|
||||
```C
|
||||
void list_buddy(void)
|
||||
void ListBuddy(void);
|
||||
```
|
||||
打印动态内存中的空闲节点信息。
|
||||
|
||||
|
@ -289,7 +267,7 @@ void list_buddy(void)
|
|||
|
||||
#### 创建内存池
|
||||
```C
|
||||
xs_gm_t xs_CreateMemGather(const char *gm_name, xs_size_t block_number, xs_size_t one_block_size);
|
||||
GatherMemType CreateMemGather(const char *gm_name, x_size_t block_number, x_size_t one_block_size);
|
||||
```
|
||||
创建一个内存池。如果创建成功,返回第一个内存块的地址,否则返回XS_NULL。
|
||||
|
||||
|
@ -301,7 +279,7 @@ xs_gm_t xs_CreateMemGather(const char *gm_name, xs_size_t block_number, xs_size
|
|||
</br>
|
||||
|
||||
```C
|
||||
xs_err_t xs_InitMemGather(struct xs_MemGather *gm_handler, const char *gm_name, void *begin_address, xs_size_t gm_size, xs_size_t one_block_size);
|
||||
x_err_t InitMemGather(struct MemGather *gm_handler, const char *gm_name, void *begin_address, x_size_t gm_size, x_size_t one_block_size);
|
||||
```
|
||||
初始化内存池,用于静态内存管理模式。
|
||||
|
||||
|
@ -316,7 +294,7 @@ xs_err_t xs_InitMemGather(struct xs_MemGather *gm_handler, const char *gm_name,
|
|||
|
||||
#### 删除内存池
|
||||
```C
|
||||
xs_err_t xs_DeleteMemGather(xs_gm_t gm_handler);
|
||||
x_err_t DeleteMemGather(GatherMemType gm_handler);
|
||||
```
|
||||
删除由xs_CreateMemGather创建的内存池。
|
||||
|
||||
|
@ -327,7 +305,7 @@ xs_err_t xs_DeleteMemGather(xs_gm_t gm_handler);
|
|||
</br>
|
||||
|
||||
```C
|
||||
xs_err_t xs_RemoveMemGather(struct xs_MemGather *gm_handler);
|
||||
x_err_t RemoveMemGather(struct MemGather *gm_handler);
|
||||
```
|
||||
删除由xs_MemGatherInit创建的内存池。
|
||||
|
||||
|
@ -339,7 +317,7 @@ xs_err_t xs_RemoveMemGather(struct xs_MemGather *gm_handler);
|
|||
|
||||
#### 分配内存块
|
||||
```C
|
||||
void *xs_AllocBlockMemGather(xs_gm_t gm_handler, xs_int32 wait_time);
|
||||
void *AllocBlockMemGather(GatherMemType gm_handler, int32 msec);
|
||||
```
|
||||
该函数将从指定的内存池中分配一个内存块。如果内存池中有可用的内存块,则从内存池的空闲块链表上取下一个内存块,将空闲内存块数目减1并返回这个内存块;如果内存池中已经没有空闲内存块,则判断超时时间设置:若超时时间设置为零,则立刻返回空内存块;如果等待时间大于零,则把当前线程挂起在该内存池对象上,直到内存池中有可用的自由内存块,或等待时间到达。
|
||||
|
||||
|
@ -353,7 +331,7 @@ void *xs_AllocBlockMemGather(xs_gm_t gm_handler, xs_int32 wait_time);
|
|||
|
||||
#### 释放内存块
|
||||
```C
|
||||
void xs_FreeBlockMemGather(void *data_block);
|
||||
void FreeBlockMemGather(void *data_block);
|
||||
```
|
||||
这个函数用于释放指定的内存块,然后增加内存池对象的可用内存块数目,并把该被释放的内存块加入空闲内存块链表上。接着判断该内存池对象上是否有挂起的线程,如果有则唤醒挂起线程链表上的首线程。
|
||||
|
||||
|
@ -363,29 +341,8 @@ void xs_FreeBlockMemGather(void *data_block);
|
|||
|
||||
</br>
|
||||
|
||||
#### 内存池钩子函数
|
||||
```C
|
||||
void xs_GmSetAllocHook(void (*gm_allocation_hook)(struct xs_MemGather *gm, void *date_ptr));
|
||||
```
|
||||
该钩子函数会在内存池分配之前调用。
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
| :------ | :------ |
|
||||
| MallocHook | 钩子函数指针 |
|
||||
</br>
|
||||
|
||||
```C
|
||||
void xs_GmSetFreeHook(void (*gm_release_hook)(struct xs_MemGather *gm, void *date_ptr));
|
||||
```
|
||||
该钩子函数会在内存池被删除后调用。
|
||||
|
||||
|
||||
| 参数 | 描述 |
|
||||
| :------ | :------ |
|
||||
| gm_release_hook | 钩子函数指针 |
|
||||
</br>
|
||||
|
||||
<span id="situation"></span>
|
||||
|
||||
## 应用场景
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -16,7 +16,7 @@ XiUOS的“心跳”通过芯片提供的硬件定时器产生的周期性中断
|
|||
|
||||
<img src="./imagesrc/tmr_config.png" width="100%"/>
|
||||
|
||||
界面中的数值将配置给变量 XS_TICK_PER_SECOND,该变量解释为每秒钟支持的节拍数(tick)。当 XS_TICK_PER_SECOND
|
||||
界面中的数值将配置给变量 TICK_PER_SECOND,该变量解释为每秒钟支持的节拍数(tick)。当 TICK_PER_SECOND
|
||||
配置为100,则tick节拍表示10毫秒,即一个时间片(timeslice)为10毫秒。
|
||||
在节拍配置成功后,系统支持的调度算法、软件定时器等依赖于该时钟周期服务的事件就可以正常工作了。例如,在XiUOS支持的时间片轮转算法当中,每进行的一次线程切换为10个tick。
|
||||
|
||||
|
@ -31,15 +31,15 @@ XiUOS的“心跳”通过芯片提供的硬件定时器产生的周期性中断
|
|||
## 函数接口
|
||||
|
||||
```c
|
||||
xs_ticks_x xs_CalculteTickFromTimeMs(xs_uint32 time_ms);
|
||||
x_ticks_t CalculteTickFromTimeMs(uint32 ms);
|
||||
```
|
||||
该函数用于获取毫秒时间转化成节拍数。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| time_ms | 毫秒时间 |
|
||||
| ms | 毫秒时间 |
|
||||
```c
|
||||
xs_uint32 xs_CalculteTimeMsFromTick(xs_ticks_x ticks);
|
||||
uint32 CalculteTimeMsFromTick(x_ticks_t ticks);
|
||||
```
|
||||
该函数用于获取节拍数转换成毫秒时间。
|
||||
|
||||
|
@ -47,7 +47,7 @@ xs_uint32 xs_CalculteTimeMsFromTick(xs_ticks_x ticks);
|
|||
| --- | --- |
|
||||
| ticks | 节拍数 |
|
||||
```c
|
||||
xs_uint32 xs_CurrentTicksGain(void);
|
||||
x_ticks_t CurrentTicksGain(void);
|
||||
```
|
||||
该函数用于获取当前的时钟节拍数。
|
||||
|
||||
|
@ -62,23 +62,27 @@ xs_uint32 xs_CurrentTicksGain(void);
|
|||
|
||||
### 内核软件定时器结构定义
|
||||
```c
|
||||
struct xs_Timer
|
||||
struct Timer
|
||||
{
|
||||
xs_uint32 id;
|
||||
xs_uint8 active_status;
|
||||
xs_uint8 trigger_mode;
|
||||
struct IdNode id_node;
|
||||
char name[NAME_NUM_MAX];
|
||||
uint8 active_status;
|
||||
uint8 trigger_mode;
|
||||
void (*func_callback)(void *param);
|
||||
void *param;
|
||||
xs_ticks_x origin_timeslice;
|
||||
xs_ticks_x deadline_timeslice;
|
||||
XS_DOUBLE_LINKLIST link;
|
||||
XS_DOUBLE_LINKLIST sortlist;
|
||||
void *param;
|
||||
x_ticks_t origin_timeslice;
|
||||
x_ticks_t deadline_timeslice;
|
||||
DoubleLinklistType link;
|
||||
DoubleLinklistType sortlist;
|
||||
uint8 prio;
|
||||
struct Work *t_work;
|
||||
struct TimerDone *done;
|
||||
};
|
||||
typedef struct xs_Timer *xs_timer_x;
|
||||
```
|
||||
| 成员 | 描述 |
|
||||
| --- | --- |
|
||||
| id | 软件定时器ID,用于唯一标识一个软件定时器 |
|
||||
| id_node | 软件定时器ID,用于唯一标识一个软件定时器 |
|
||||
| name | 软件定时器名称 |
|
||||
| active_status | 定时器的激活状态 |
|
||||
| trigger_mode | 定时器的触发模式,包含单次触发和周期触发两种方式 |
|
||||
| func_callback | 定时器超时回调函数 |
|
||||
|
@ -87,6 +91,9 @@ typedef struct xs_Timer *xs_timer_x;
|
|||
| deadline_timeslice | 截止时间 |
|
||||
| link | 系统中所有定时器构成的链表 |
|
||||
| sortlist | 处于激活态的定时器链表,并按时间排序 |
|
||||
| prio | 记录使用定时器处理回调的线程优先级 |
|
||||
| t_work | 定时器所用到的工作队列 |
|
||||
| done | 定时器的函数操作集 |
|
||||
|
||||
<span id="timer_api"></span>
|
||||
|
||||
|
@ -97,51 +104,52 @@ typedef struct xs_Timer *xs_timer_x;
|
|||
#define TIMER_TRIGGER_ONCE (1 << 0)
|
||||
#define TIMER_TRIGGER_PERIODIC (1 << 1)
|
||||
|
||||
xs_timer_t xs_KCreateTimer(const char *name, void (*timeout)(void *parameter), void *parameter, xs_ticks_x time, xs_uint8 trigger_mode);
|
||||
int32 KCreateTimer(const char *name, void (*timeout)(void *parameter), void *parameter, x_ticks_t time, uint8 trigger_mode);
|
||||
```
|
||||
该函数用于创建一个内核软件定时器,并返回创建成功的软件定时器的ID,ID默认范围0-255,可配置。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| trigge_way | 触发方式,可以配置为宏TRIGGE_WAY_ONCE和TRIGGE_WAY_PERIODIC |
|
||||
| func_callback | 软件定时器回调函数 |
|
||||
| func_param | 软件定时器回调函数参数 |
|
||||
| ticks | 配置需要等待的超时时间 |
|
||||
| name | 定时器名称 |
|
||||
| timeout | 软件定时器回调函数 |
|
||||
| parameter | 软件定时器回调函数参数 |
|
||||
| time | 配置需要等待的超时时间,单位tick |
|
||||
| trigger_mode | 触发方式,可以配置为宏TRIGGE_WAY_ONCE和TRIGGE_WAY_PERIODIC |
|
||||
|
||||
```c
|
||||
void xs_KTimerDelete(xs_uint16 id);
|
||||
void KTimerDelete(int32 timer_id);
|
||||
```
|
||||
该函数用于删除一个软件定时器。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| id | 待删除的软件定时器ID |
|
||||
| timer_id | 待删除的软件定时器ID |
|
||||
|
||||
```c
|
||||
xs_int32 xs_KTimerStartRun(xs_uint16 id);
|
||||
x_err_t KTimerStartRun(int32 timer_id);
|
||||
```
|
||||
该函数用于启动一个软件定时器。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| id | 已创建且待运行的软件定时器ID |
|
||||
| timer_id | 已创建且待运行的软件定时器ID |
|
||||
|
||||
```c
|
||||
xs_int32 xs_KTimerQuitRun(xs_uint16 id);
|
||||
x_err_t KTimerQuitRun(int32 timer_id);
|
||||
```
|
||||
该函数用于停止一个软件定时器。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| id | 待停止运行的软件定时器ID |
|
||||
| timer_id | 待停止运行的软件定时器ID |
|
||||
|
||||
```c
|
||||
xs_int32 xs_KTimerModify(xs_uint16 id, xs_tick_x ticks);
|
||||
x_err_t KTimerModify(int32 timer_id, x_tick_t ticks);
|
||||
```
|
||||
该函数用于修改一个软件定时器的超时时间。
|
||||
|
||||
| 参数 | 描述 |
|
||||
| --- | --- |
|
||||
| id | 待修改超时时间的软件定时器ID |
|
||||
| timer_id | 待修改超时时间的软件定时器ID |
|
||||
| ticks | 超时时间 |
|
||||
|
||||
|
|
Loading…
Reference in New Issue