中断支持转发到用户态
This commit is contained in:
@@ -54,7 +54,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag,
|
||||
thread_t *th = thread_get_current();
|
||||
irq_sender_t *irq = container_of(kobj, irq_sender_t, kobj);
|
||||
|
||||
if (sys_p.prot != IPC_PROT)
|
||||
if (sys_p.prot != IRQ_PROT)
|
||||
{
|
||||
f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
|
||||
return;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
|
||||
msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage);
|
||||
msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage);
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage);
|
||||
msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage);
|
||||
7
mkrtos_user/lib/sys/inc/u_irq_sender.h
Normal file
7
mkrtos_user/lib/sys/inc/u_irq_sender.h
Normal file
@@ -0,0 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "u_types.h"
|
||||
|
||||
msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no);
|
||||
msg_tag_t uirq_wait(obj_handler_t obj_inx);
|
||||
msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no);
|
||||
@@ -6,7 +6,21 @@ enum
|
||||
{
|
||||
FACTORY_CREATE_KOBJ
|
||||
};
|
||||
msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj),
|
||||
0,
|
||||
IRQ_PROT,
|
||||
vpage.raw,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
msg_tag_t tag = msg_tag_init(r0);
|
||||
|
||||
return tag;
|
||||
}
|
||||
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
65
mkrtos_user/lib/sys/src/u_irq_sender.c
Normal file
65
mkrtos_user/lib/sys/src/u_irq_sender.c
Normal file
@@ -0,0 +1,65 @@
|
||||
|
||||
|
||||
#include "u_log.h"
|
||||
#include "u_prot.h"
|
||||
#include "u_types.h"
|
||||
#include "u_util.h"
|
||||
#include <string.h>
|
||||
enum log_op
|
||||
{
|
||||
WRITE_DATA,
|
||||
READ_DATA,
|
||||
SET_FLAGS
|
||||
};
|
||||
enum irq_sender_op
|
||||
{
|
||||
BIND_IRQ, //!< 绑定一个中断号
|
||||
UNBIND_IRQ, //!< 解除绑定
|
||||
WAIT_IRQ, //!< 等待中断触发
|
||||
ACK_IRQ, //!< 中断确认
|
||||
};
|
||||
msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(BIND_IRQ, IRQ_PROT, obj_inx),
|
||||
0,
|
||||
irq_no,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
msg_tag_t tag = msg_tag_init(r0);
|
||||
|
||||
return tag;
|
||||
}
|
||||
msg_tag_t uirq_wait(obj_handler_t obj_inx)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(WAIT_IRQ, IRQ_PROT, obj_inx),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
msg_tag_t tag = msg_tag_init(r0);
|
||||
|
||||
return tag;
|
||||
}
|
||||
msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no)
|
||||
{
|
||||
register volatile umword_t r0 asm("r0");
|
||||
|
||||
syscall(syscall_prot_create(ACK_IRQ, IRQ_PROT, obj_inx),
|
||||
0,
|
||||
irq_no,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0);
|
||||
msg_tag_t tag = msg_tag_init(r0);
|
||||
|
||||
return tag;
|
||||
}
|
||||
@@ -9,22 +9,12 @@
|
||||
#include <stdio.h>
|
||||
#include "u_ipc.h"
|
||||
#include "u_hd_man.h"
|
||||
|
||||
#include "u_irq_sender.h"
|
||||
extern void futex_init(void);
|
||||
int main(int argc, char *args[])
|
||||
{
|
||||
uint8_t data[10];
|
||||
// futex_init();
|
||||
ulog_write_str(LOG_PROT, "init..\n");
|
||||
// while (1)
|
||||
// {
|
||||
// int len = ulog_read_bytes(LOG_PROT, data, sizeof(data) - 1);
|
||||
// if (len > 0)
|
||||
// {
|
||||
// data[len] = 0;
|
||||
// printf("%s\n", data);
|
||||
// }
|
||||
// }
|
||||
#if 0
|
||||
mm_test();
|
||||
ulog_test();
|
||||
@@ -36,8 +26,9 @@ int main(int argc, char *args[])
|
||||
ipc_test();
|
||||
map_test();
|
||||
ipc_timeout_test();
|
||||
#endif
|
||||
app_test();
|
||||
#endif
|
||||
irq_test();
|
||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
||||
printf("exit init.\n");
|
||||
return 0;
|
||||
|
||||
13
mkrtos_user/server/init/src/test/irq_test.c
Normal file
13
mkrtos_user/server/init/src/test/irq_test.c
Normal file
@@ -0,0 +1,13 @@
|
||||
|
||||
#include "u_types.h"
|
||||
#include "u_prot.h"
|
||||
#include "u_factory.h"
|
||||
|
||||
void irq_test(void)
|
||||
{
|
||||
obj_handler_t obj = handler_alloc();
|
||||
factory_create_irq_sender(FACTORY_PROT, vpage_create_raw3(0, 0, obj));
|
||||
uirq_bind(obj, 38);
|
||||
uirq_wait(obj);
|
||||
uirq_ack(obj, 38);
|
||||
}
|
||||
@@ -3,6 +3,14 @@
|
||||
|
||||
void ulog_test(void)
|
||||
{
|
||||
uint8_t data[10];
|
||||
|
||||
ulog_write_str(LOG_PROT, "Init task running..\n");
|
||||
ulog_write_str(LOG_PROT, "todo..\n");
|
||||
|
||||
int len = ulog_read_bytes(LOG_PROT, data, sizeof(data) - 1);
|
||||
if (len > 0)
|
||||
{
|
||||
data[len] = 0;
|
||||
printf("%s\n", data);
|
||||
}
|
||||
}
|
||||
@@ -12,3 +12,4 @@ void ipc_test(void);
|
||||
void thread_exit_test(void);
|
||||
void map_test(void);
|
||||
void ipc_timeout_test(void);
|
||||
void irq_test(void);
|
||||
|
||||
Reference in New Issue
Block a user