线程增加固有ipc缓存区

This commit is contained in:
zhangzheng
2023-08-29 18:36:32 +08:00
parent 3b1171fca8
commit 1733c9dd14
10 changed files with 143 additions and 74 deletions

View File

@@ -1,5 +1,5 @@
#pragma once
#include "u_prot.h"
msg_tag_t ipc_recv(obj_handler_t obj, void *buf, int len);
msg_tag_t ipc_send(obj_handler_t obj, void *buf, int len);
msg_tag_t ipc_recv(obj_handler_t obj);
msg_tag_t ipc_send(obj_handler_t obj, umword_t len);

View File

@@ -2,6 +2,8 @@
#include "u_types.h"
msg_tag_t thread_msg_bug_set(obj_handler_t obj, void *msg);
msg_tag_t thread_msg_bug_get(obj_handler_t obj, umword_t *msg, umword_t *len);
msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t ram);
msg_tag_t thread_run(obj_handler_t obj);
msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj);

View File

@@ -5,13 +5,13 @@ enum ipc_op
IPC_SEND, //!< 发送IPC消息
IPC_REVC, //!< 接受IPC消息
};
msg_tag_t ipc_recv(obj_handler_t obj, void *buf, int len)
msg_tag_t ipc_recv(obj_handler_t obj)
{
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(IPC_REVC, 2, IPC_PROT).raw,
buf,
len,
0,
0,
0,
0,
0);
@@ -19,15 +19,15 @@ msg_tag_t ipc_recv(obj_handler_t obj, void *buf, int len)
return tag;
}
msg_tag_t ipc_send(obj_handler_t obj, void *buf, int len)
msg_tag_t ipc_send(obj_handler_t obj, umword_t len)
{
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(IPC_SEND, 2, IPC_PROT).raw,
buf,
len,
0,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);

View File

@@ -1,21 +1,60 @@
#include "u_prot.h"
#include "u_types.h"
#include "u_thread.h"
enum thread_op
{
SET_EXEC_REGS,
RUN_THREAD,
BIND_TASK,
MSG_BUG_GET,
MSG_BUG_SET,
};
msg_tag_t thread_msg_bug_set(obj_handler_t obj, void *msg)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
register volatile umword_t r2 asm("r2");
syscall(obj, msg_tag_init3(MSG_BUG_SET, 0, THREAD_PROT).raw,
msg,
0,
0,
0,
0);
return msg_tag_init(r0);
}
msg_tag_t thread_msg_bug_get(obj_handler_t obj, umword_t *msg, umword_t *len)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
register volatile umword_t r2 asm("r2");
syscall(obj, msg_tag_init3(MSG_BUG_GET, 0, THREAD_PROT).raw,
0,
0,
0,
0,
0);
if (msg)
{
*msg = r1;
}
if (len)
{
*len = r2;
}
return msg_tag_init(r0);
}
msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t ram)
{
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(SET_EXEC_REGS, 3, THREAD_PROT).raw,
obj,
pc,
sp,
ram,
0);
0, 0);
msg_tag_t tag = msg_tag_init(r0);
return tag;
@@ -25,7 +64,7 @@ msg_tag_t thread_run(obj_handler_t obj)
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(RUN_THREAD, 1, THREAD_PROT).raw,
obj,
0,
0,
0,
0,
@@ -39,11 +78,10 @@ msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj)
register volatile umword_t r0 asm("r0");
syscall(obj, msg_tag_init3(BIND_TASK, 1, THREAD_PROT).raw,
obj,
tk_obj,
0,
0,
0);
0, 0);
msg_tag_t tag = msg_tag_init(r0);
return tag;

View File

@@ -29,16 +29,19 @@ void mm_test(void)
#include "u_ipc.h"
void thread_test_func(void)
{
char data[8];
char *buf;
umword_t len;
thread_msg_bug_get(11, (umword_t *)(&buf), NULL);
while (1)
{
msg_tag_t tag = ipc_recv(12, data, sizeof(data));
msg_tag_t tag = ipc_recv(12);
if (msg_tag_get_prot(tag) > 0)
{
printf("recv data is %s\n", data);
buf[msg_tag_get_prot(tag)] = 0;
printf("recv data is %s\n", buf);
}
strcpy(data, "reply");
ipc_send(12, data, sizeof(data));
strcpy(buf, "reply");
ipc_send(12, strlen("reply"));
}
printf("thread_test_func.\n");
task_unmap(TASK_PROT, 11);
@@ -46,15 +49,18 @@ void thread_test_func(void)
}
void thread_test_func2(void)
{
char data[8] = "1234";
char *buf;
umword_t len;
thread_msg_bug_get(10, (umword_t *)(&buf), NULL);
while (1)
{
strcpy(data, "1234");
ipc_send(12, data, sizeof(data));
msg_tag_t tag = ipc_recv(12, data, sizeof(data));
strcpy(buf, "1234");
ipc_send(12, strlen(buf));
msg_tag_t tag = ipc_recv(12);
if (msg_tag_get_prot(tag) > 0)
{
printf("recv data is %s\n", data);
buf[msg_tag_get_prot(tag)] = 0;
printf("recv data is %s\n", buf);
}
}
printf("thread_test_func2.\n");
@@ -63,10 +69,13 @@ void thread_test_func2(void)
}
void thread_test_func3(void)
{
char data[8] = "____";
char *buf;
umword_t len;
thread_msg_bug_get(13, (umword_t *)(&buf), NULL);
strcpy(buf, "____");
while (1)
{
ipc_send(12, data, sizeof(data));
ipc_send(12, strlen(buf));
}
printf("thread_test_func2.\n");
task_unmap(TASK_PROT, 10);
@@ -101,7 +110,8 @@ typedef struct app_info
};
const char dot_text[];
} app_info_t;
static char buf0[128];
static char buf1[128];
#include "cpiofs.h"
void factory_test(void)
{
@@ -123,11 +133,13 @@ void factory_test(void)
return;
}
#if 1
thread_msg_bug_set(11, buf0);
thread_exec_regs(11, (umword_t)thread_test_func, (umword_t)val + 1024, RAM_BASE());
thread_bind_task(11, TASK_PROT);
thread_run(11);
factory_create_thread(FACTORY_PROT, 10);
thread_msg_bug_set(10, buf1);
thread_exec_regs(10, (umword_t)thread_test_func2, (umword_t)val1 + 1024, RAM_BASE());
thread_bind_task(10, TASK_PROT);
thread_run(10);