中断支持转发到用户态
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();
|
thread_t *th = thread_get_current();
|
||||||
irq_sender_t *irq = container_of(kobj, irq_sender_t, kobj);
|
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;
|
f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "u_types.h"
|
#include "u_types.h"
|
||||||
#include "u_prot.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_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_thread(obj_handler_t obj, vpage_t vpage);
|
||||||
msg_tag_t factory_create_task(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
|
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)
|
msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage)
|
||||||
{
|
{
|
||||||
register volatile umword_t r0 asm("r0");
|
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 <stdio.h>
|
||||||
#include "u_ipc.h"
|
#include "u_ipc.h"
|
||||||
#include "u_hd_man.h"
|
#include "u_hd_man.h"
|
||||||
|
#include "u_irq_sender.h"
|
||||||
extern void futex_init(void);
|
extern void futex_init(void);
|
||||||
int main(int argc, char *args[])
|
int main(int argc, char *args[])
|
||||||
{
|
{
|
||||||
uint8_t data[10];
|
|
||||||
// futex_init();
|
// futex_init();
|
||||||
ulog_write_str(LOG_PROT, "init..\n");
|
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
|
#if 0
|
||||||
mm_test();
|
mm_test();
|
||||||
ulog_test();
|
ulog_test();
|
||||||
@@ -36,8 +26,9 @@ int main(int argc, char *args[])
|
|||||||
ipc_test();
|
ipc_test();
|
||||||
map_test();
|
map_test();
|
||||||
ipc_timeout_test();
|
ipc_timeout_test();
|
||||||
#endif
|
|
||||||
app_test();
|
app_test();
|
||||||
|
#endif
|
||||||
|
irq_test();
|
||||||
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, TASK_THIS)); // 删除当前task,以及申请得所有对象
|
||||||
printf("exit init.\n");
|
printf("exit init.\n");
|
||||||
return 0;
|
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)
|
void ulog_test(void)
|
||||||
{
|
{
|
||||||
|
uint8_t data[10];
|
||||||
|
|
||||||
ulog_write_str(LOG_PROT, "Init task running..\n");
|
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 thread_exit_test(void);
|
||||||
void map_test(void);
|
void map_test(void);
|
||||||
void ipc_timeout_test(void);
|
void ipc_timeout_test(void);
|
||||||
|
void irq_test(void);
|
||||||
|
|||||||
Reference in New Issue
Block a user