modify kernel contents from Wang Weigen

it is OK
This commit is contained in:
xuedongliang 2021-04-30 18:56:25 +08:00
commit a0f170b3cf
4 changed files with 625 additions and 368 deletions

View File

@ -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;
}
```

View File

@ -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

View File

@ -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);
```
该函数用于创建一个内核软件定时器并返回创建成功的软件定时器的IDID默认范围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 | 超时时间 |