log对象支持从读取控制台数据

This commit is contained in:
zhangzheng
2023-09-15 00:07:58 +08:00
parent 8beb51f305
commit 4cdd72c0d7
34 changed files with 676 additions and 87 deletions

View File

@@ -38,3 +38,4 @@
long syscall_backend(long sys_inx, ...);
umword_t be_mmap2(va_list ap);
umword_t be_munmap(va_list ap);

View File

@@ -4,21 +4,27 @@
#include "u_ipc.h"
#include "u_mm.h"
#include "u_app.h"
#include "u_log.h"
#include <pthread_impl.h>
#include <assert.h>
static pthread_spinlock_t lock;
extern void *app_start_addr;
// extern char __heap_start__[];
extern umword_t __heap_size__;
// extern void *_start_;
static umword_t mm_bitemp[32 /*TODO:自动分配,或者静态划分*/];
// extern char heap[];
static void *mm_page_alloc(void)
static void *mm_page_alloc(int page_nr)
{
// pthread_spin_lock(&lock);
int cnt = 0;
mword_t find_inx = -1;
app_info_t *info = app_info_get(app_start_addr);
assert(info);
void *heap_addr = RAM_BASE() + info->i.heap_offset - info->i.data_offset;
size_t max_page_nr = (info->i.heap_size) / 512;
printf("heap is 0x%x, max page nr is %d.\n", heap_addr, max_page_nr);
for (umword_t i = 0; i < max_page_nr; i++)
size_t max_page_nr = (info->i.heap_size) / PAGE_SIZE;
if (max_page_nr > sizeof(mm_bitemp) * WORD_BITS)
{
ulog_write_str(LOG_PROT, "mm bitmap is to small.\n");
}
// printf("heap is 0x%x, max page nr is %d.\n", heap_addr, max_page_nr);
pthread_spin_lock(&lock);
for (umword_t i = 0; i < ROUND_UP(max_page_nr, WORD_BITS); i++)
{
if (mm_bitemp[i] != (umword_t)(-1))
{
@@ -27,19 +33,56 @@ static void *mm_page_alloc(void)
if (MK_GET_BIT(mm_bitemp[i], j) == 0)
{
// 找到空闲的
umword_t find_inx = i * WORD_BITS + j;
MK_SET_BIT(mm_bitemp[i], j);
// pthread_spin_unlock(&lock);
return find_inx * PAGE_SIZE + (char *)heap_addr;
if (find_inx == -1)
{
find_inx = i * WORD_BITS + j;
}
cnt++;
if (find_inx + cnt >= max_page_nr)
{
pthread_spin_unlock(&lock);
return NULL;
}
if (cnt >= page_nr)
{
for (int m = find_inx; m < find_inx + cnt; m++)
{
MK_SET_BIT(mm_bitemp[m / WORD_BITS], m % WORD_BITS);
}
pthread_spin_unlock(&lock);
printf("st_inx:%d, cnt:%d\n", find_inx, cnt);
return find_inx * PAGE_SIZE + (char *)heap_addr;
}
}
else
{
cnt = 0;
find_inx = -1;
}
}
}
}
// pthread_spin_unlock(&lock);
pthread_spin_unlock(&lock);
return NULL;
}
static void mm_page_free(int st, int nr)
{
app_info_t *info = app_info_get(app_start_addr);
assert(info);
void *heap_addr = RAM_BASE() + info->i.heap_offset - info->i.data_offset;
size_t max_page_nr = (info->i.heap_size) / PAGE_SIZE;
pthread_spin_lock(&lock);
for (int i = st; (i < st + nr) && (i < max_page_nr); i++)
{
MK_CLR_BIT(mm_bitemp[i / WORD_BITS], i % WORD_BITS);
}
pthread_spin_unlock(&lock);
}
static int sys_mmap2(void *start, size_t len, int prot, int flags, int fd, off_t _offset, umword_t *addr)
{
if (fd >= 0)
@@ -47,7 +90,7 @@ static int sys_mmap2(void *start, size_t len, int prot, int flags, int fd, off_t
return -ENOSYS;
}
len = ALIGN(len, PAGE_SIZE);
*addr = (umword_t)mm_page_alloc();
*addr = (umword_t)mm_page_alloc(len / PAGE_SIZE);
return 0;
}
@@ -72,3 +115,18 @@ umword_t be_mmap2(va_list ap)
}
return addr;
}
umword_t be_munmap(va_list ap)
{
void *start;
size_t len;
ARG_2_BE(ap, len, size_t, start, void *);
app_info_t *info = app_info_get(app_start_addr);
assert(info);
void *heap_addr = RAM_BASE() + info->i.heap_offset - info->i.data_offset;
len = ALIGN(len, PAGE_SIZE);
printf("munmap 0x%x, 0x%x.\n", start, len);
mm_page_free(((umword_t)(start) - (umword_t)heap_addr) / PAGE_SIZE, len / PAGE_SIZE);
return 0;
}

View File

@@ -8,6 +8,7 @@ typedef long (*sys_call_func)(va_list ap);
static const sys_call_func sys_call_list[] = {
// TODO: add syscall func pointer.
[SYS_munmap] = be_munmap,
[SYS_mmap2] = be_mmap2,
[SYS_read] = sys_be_read,
[SYS_write] = sys_be_read,

View File

@@ -1,5 +1,7 @@
#include "u_types.h"
#define APP_MAGIC "MKRTOS."
typedef struct app_info
{
const char d[32];
@@ -28,5 +30,14 @@ typedef struct app_info
static inline app_info_t *app_info_get(void *addr)
{
return (app_info_t *)addr;
app_info_t *app = (app_info_t *)addr;
const char *magic = APP_MAGIC;
for (int i = 0; i < sizeof(app->magic) - 1; i++)
{
if (app->magic[i] != magic[i])
{
return NULL;
}
}
return app;
}

View File

@@ -5,3 +5,4 @@
#define ULOG_RW_MAX_BYTES (WORD_BYTES * 5)
void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len);
void ulog_write_str(obj_handler_t obj_inx, const char *str);
int ulog_read_bytes(obj_handler_t obj_inx, uint8_t *data, umword_t len);

View File

@@ -9,6 +9,7 @@
#define IPC_PROT 5
#define MM_PROT 6
#define SYS_PROT 7
#define IRQ_PROT 8
#define THREAD_MAIN THREAD_PROT
#define TASK_THIS TASK_PROT

View File

@@ -11,6 +11,47 @@ enum log_op
READ_DATA,
SET_FLAGS
};
static msg_tag_t ulog_read_bytes_raw(obj_handler_t obj_inx, umword_t data[5], int len)
{
register volatile umword_t r0 asm("r0");
register volatile umword_t r1 asm("r1");
register volatile umword_t r2 asm("r2");
register volatile umword_t r3 asm("r3");
register volatile umword_t r4 asm("r4");
register volatile umword_t r5 asm("r5");
syscall(syscall_prot_create(READ_DATA, LOG_PROT, obj_inx),
msg_tag_init4(0, 0, 0, 0).raw,
len,
0,
0,
0,
0);
msg_tag_t tag = msg_tag_init(r0);
{
((umword_t *)data)[0] = r1;
((umword_t *)data)[1] = r2;
((umword_t *)data)[2] = r3;
((umword_t *)data)[3] = r4;
((umword_t *)data)[4] = r5;
}
return tag;
}
int ulog_read_bytes(obj_handler_t obj_inx, uint8_t *data, umword_t len)
{
umword_t buffer[5];
msg_tag_t tag = ulog_read_bytes_raw(obj_inx, buffer, len);
if (msg_tag_get_val(tag) > 0)
{
for (int i = 0; i < msg_tag_get_val(tag); i++)
{
data[i] = ((uint8_t *)buffer)[i];
}
}
return msg_tag_get_val(tag);
}
void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len)
{
uint8_t write_buf[ULOG_RW_MAX_BYTES] = {0};
@@ -38,6 +79,10 @@ void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len)
{
return;
}
for (int i = 0; i < ULOG_RW_MAX_BYTES; i++)
{
write_buf[i] = 0;
}
}
}

View File

@@ -5,8 +5,9 @@
#include "u_task.h"
#include "u_hd_man.h"
#include <pthread.h>
#define HANDLER_START_INX 10
#define HANDLER_MAX_NR 64
#define HANDLER_START_INX 10 //!< fd开始的值前10个内核保留
#define HANDLER_MAX_NR 64 //!< 单个task最大支持的hd数量
static umword_t bitmap_handler_alloc[HANDLER_MAX_NR / WORD_BYTES];
static pthread_spinlock_t lock;
@@ -39,6 +40,11 @@ void handler_free(obj_handler_t hd_inx)
hd_inx -= HANDLER_START_INX;
umword_t word_offset = hd_inx / WORD_BITS;
umword_t bits_offset = hd_inx % WORD_BITS;
if (word_offset >= (HANDLER_MAX_NR / WORD_BYTES))
{
return;
}
pthread_spin_lock(&lock);
MK_CLR_BIT(bitmap_handler_alloc[word_offset], bits_offset);
pthread_spin_unlock(&lock);

View File

@@ -13,8 +13,18 @@
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();

View File

@@ -13,5 +13,5 @@
#define STACK_ATTR
#endif
__attribute__((used)) HEAP_ATTR char heap[HEAP_SIZE];
__attribute__((used)) HEAP_ATTR static char heap[HEAP_SIZE];
__attribute__((used)) STACK_ATTR static char stack[STACK_SIZE];

View File

@@ -9,11 +9,27 @@
#include <assert.h>
#include <stdio.h>
#include <malloc.h>
void malloc_test(void)
{
void *mem = malloc(1024);
assert(mem);
void *mem1 = malloc(1024);
assert(mem1);
free(mem);
free(mem1);
mem = malloc(4 * 1024);
assert(mem);
free(mem);
mem1 = malloc(1024);
assert(mem1);
free(mem1);
}
int main(int argc, char *args[])
{
ulog_write_str(LOG_PROT, "MKRTOS:\n");
void *mem = malloc(12);
free(mem);
malloc_test();
ipc_wait(12, 0);
ipc_reply(12, msg_tag_init4(0, 0, 0, 0));
char *buf;