线程增加固有ipc缓存区
This commit is contained in:
@@ -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);
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user