log对象支持从读取控制台数据
This commit is contained in:
@@ -38,3 +38,4 @@
|
||||
long syscall_backend(long sys_inx, ...);
|
||||
|
||||
umword_t be_mmap2(va_list ap);
|
||||
umword_t be_munmap(va_list ap);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user