解决指定内存区域分配时,缺页模拟的内存还是使用的第一块
This commit is contained in:
4
.vscode/launch.json
vendored
4
.vscode/launch.json
vendored
@@ -71,8 +71,8 @@
|
||||
// "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
|
||||
// "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
|
||||
// "miDebuggerPath": "/home/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb",
|
||||
// "miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
|
||||
"miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
|
||||
"miDebuggerPath": "/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gdb",
|
||||
// "miDebuggerPath": "/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/arm-none-eabi-gdb",
|
||||
"miDebuggerServerAddress": "127.0.0.1:33333",
|
||||
"MIMode": "gdb",
|
||||
"setupCommands": [
|
||||
|
||||
@@ -894,7 +894,7 @@ void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t
|
||||
*/
|
||||
void lcd_num_show(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, int32_t num, uint8_t num_bit)
|
||||
{
|
||||
uint8_t i, buf[12], start;
|
||||
uint8_t i, buf[12], start = 0;
|
||||
|
||||
buf[11] = 0;
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \
|
||||
-Wno-builtin-declaration-mismatch \
|
||||
")
|
||||
|
||||
# -O1 \
|
||||
# -Ofast \
|
||||
# message(编译参数:${CMAKE_C_FLAGS})
|
||||
|
||||
|
||||
@@ -22,4 +22,6 @@ target_include_directories(
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/core_support
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/cmsis/cm4/device_support
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_bsp/AT32/AT32F435_437_Firmware_Library_V2.2.0/libraries/drivers/inc
|
||||
|
||||
${CMAKE_CURRENT_SOURCE_DIR}/../CmBacktrace/cm_backtrace
|
||||
)
|
||||
|
||||
@@ -18,6 +18,11 @@
|
||||
#include "mpu.h"
|
||||
#include "boot_info.h"
|
||||
#include "at32f435_437_clock.h"
|
||||
#include <cm_backtrace.h>
|
||||
|
||||
#define HARDWARE_VERSION "V1.0.0"
|
||||
#define SOFTWARE_VERSION "V0.1.0"
|
||||
|
||||
__ALIGN__(CONFIG_THREAD_BLOCK_SIZE)
|
||||
static uint8_t thread_knl_stack[CONFIG_THREAD_BLOCK_SIZE] = {0};
|
||||
void *_estack = thread_knl_stack + CONFIG_THREAD_BLOCK_SIZE;
|
||||
@@ -109,7 +114,6 @@ void arch_init(void)
|
||||
SCB->SHCSR |= SCB_SHCSR_USGFAULTENA_Msk;
|
||||
SCB->SHCSR |= SCB_SHCSR_BUSFAULTENA_Msk;
|
||||
((uint8_t *)(0xE000E008))[0] |= 0x6;
|
||||
// RCC_ClocksTypeDef RCC_ClocksStatus;
|
||||
// RCC_GetClocksFreq(&RCC_ClocksStatus);
|
||||
cm_backtrace_init("mkrtos", HARDWARE_VERSION, SOFTWARE_VERSION);
|
||||
}
|
||||
INIT_LOW_HARD(arch_init);
|
||||
|
||||
@@ -97,6 +97,11 @@ static inline umword_t arch_get_isr_no(void)
|
||||
:);
|
||||
return num;
|
||||
}
|
||||
__attribute__( (always_inline) ) static __inline uint32_t cmb_get_lr(void) {
|
||||
uint32_t result;
|
||||
__asm volatile ("mov %0, lr" : "=r" (result) );
|
||||
return (result);
|
||||
}
|
||||
static inline void arch_set_knl_sp(umword_t sp)
|
||||
{
|
||||
write_sysreg(sp, msp);
|
||||
|
||||
@@ -99,9 +99,9 @@ static inline umword_t arch_get_isr_no(void)
|
||||
return num;
|
||||
}
|
||||
__attribute__( (always_inline) ) static __inline uint32_t cmb_get_lr(void) {
|
||||
uint32_t result;
|
||||
__asm volatile ("mov %0, lr" : "=r" (result) );
|
||||
return (result);
|
||||
uint32_t result;
|
||||
__asm volatile ("mov %0, lr" : "=r" (result) );
|
||||
return (result);
|
||||
}
|
||||
static inline void arch_set_knl_sp(umword_t sp)
|
||||
{
|
||||
|
||||
@@ -18,6 +18,7 @@ typedef struct mm_space
|
||||
#else
|
||||
void *mm_block; //!< task 的私有内存块
|
||||
size_t mm_block_size; //!< 私有内存块的大小
|
||||
int mem_block_inx; //!< 内存块号
|
||||
#endif
|
||||
task_vma_t mem_vma; //!< 虚拟内存区域
|
||||
} mm_space_t;
|
||||
|
||||
@@ -18,6 +18,7 @@ void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align);
|
||||
void *mm_limit_alloc_align_raw(int mem_inx, ram_limit_t *limit, size_t size, size_t align);
|
||||
void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size);
|
||||
void mm_limit_free_align_raw(int mem_inx, ram_limit_t *limit, void *mem, size_t size);
|
||||
void mm_info_raw(int mem_inx, size_t *total, size_t *free);
|
||||
void mm_info(size_t *total, size_t *free);
|
||||
void *mm_limit_alloc_raw(int mem_inx, ram_limit_t *limit, size_t size);
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ extern "C"
|
||||
#endif
|
||||
#include "stdarg.h"
|
||||
#define XF_USE_OUTPUT 1 /* 1: Enable output functions */
|
||||
#define XF_CRLF 0 /* 1: Convert \n ==> \r\n in the output char */
|
||||
#define XF_CRLF 1 /* 1: Convert \n ==> \r\n in the output char */
|
||||
#define XF_USE_DUMP 0 /* 1: Enable put_dump function */
|
||||
#define XF_USE_LLI 0 /* 1: Enable long long integer in size prefix ll */
|
||||
#define XF_USE_FP 0 /* 1: Enable support for floating point in type e and f */
|
||||
|
||||
@@ -40,8 +40,9 @@ static region_info_t *vma_alloc_pt_region(task_vma_t *vma)
|
||||
{
|
||||
assert(vma != NULL);
|
||||
mword_t status = task_vma_lock(vma);
|
||||
for (int i = 0; i < CONFIG_REGION_NUM; i++)
|
||||
for (int i = CONFIG_REGION_NUM - 1; i >= 0 ; i--)
|
||||
{
|
||||
/* 从最后一个开始分配,让用户使用的有更高的优先级 */
|
||||
if (vma->pt_regions[i].region_inx < 0)
|
||||
{
|
||||
vma->pt_regions[i].region_inx = (int16_t)i;
|
||||
@@ -327,7 +328,7 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size,
|
||||
if (paddr == 0)
|
||||
{
|
||||
// 未设置物理内存,则自动申请一个
|
||||
vma_addr = (addr_t)mm_limit_alloc_align(pt_task->lim, size, mem_align_size);
|
||||
vma_addr = (addr_t)mm_limit_alloc_align_raw(pt_task->mm_space.mem_block_inx, pt_task->lim, size, mem_align_size);
|
||||
assert(((vma_addr & (mem_align_size - 1))) == 0);
|
||||
is_alloc_mem = TRUE;
|
||||
}
|
||||
@@ -408,7 +409,7 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size,
|
||||
err_end:
|
||||
if (is_alloc_mem)
|
||||
{
|
||||
mm_limit_free_align(pt_task->lim, (void *)vma_addr, mem_align_size);
|
||||
mm_limit_free_align_raw(pt_task->mm_space.mem_block_inx, pt_task->lim, (void *)vma_addr, mem_align_size);
|
||||
}
|
||||
end:
|
||||
if (status >= 0)
|
||||
@@ -528,7 +529,7 @@ static int task_vma_free_inner(task_vma_t *task_vma, vaddr_t vaddr, size_t size,
|
||||
|
||||
if (is_free_mem)
|
||||
{
|
||||
mm_limit_free_align(pt_task->lim, (void *)vma_addr, size);
|
||||
mm_limit_free_align_raw(pt_task->mm_space.mem_block_inx, pt_task->lim, (void *)vma_addr, size);
|
||||
}
|
||||
end:
|
||||
if (pt_task == thread_get_current_task())
|
||||
@@ -666,6 +667,7 @@ typedef struct vma_clean_params
|
||||
{
|
||||
mln_rbtree_t *tree;
|
||||
ram_limit_t *lim;
|
||||
task_t *pt_task;
|
||||
} vma_clean_params_t;
|
||||
static int rbtree_iterate_handler_delete(mln_rbtree_node_t *node, void *udata)
|
||||
{
|
||||
@@ -674,7 +676,8 @@ static int rbtree_iterate_handler_delete(mln_rbtree_node_t *node, void *udata)
|
||||
|
||||
if (!(vma_addr_get_flags(vma_data->vaddr) & VMA_ADDR_RESV))
|
||||
{
|
||||
mm_limit_free_align(params->lim, (void *)vma_node_get_paddr(vma_data), vma_data->size);
|
||||
vma_t *vma_data = mln_rbtree_node_data_get(node);
|
||||
mm_limit_free_align_raw(params->pt_task->mm_space.mem_block_inx, params->lim, (void *)vma_node_get_paddr(vma_data), vma_data->size);
|
||||
}
|
||||
|
||||
mln_rbtree_delete(params->tree, node);
|
||||
@@ -699,6 +702,7 @@ int task_vma_clean(task_vma_t *task_vma)
|
||||
vma_clean_params_t params = {
|
||||
.lim = pt_task->lim,
|
||||
.tree = &task_vma->alloc_tree,
|
||||
.pt_task = pt_task,
|
||||
}; // 删除所有的节点
|
||||
ret = mln_rbtree_iterate(&task_vma->alloc_tree, rbtree_iterate_handler_delete, ¶ms);
|
||||
return ret;
|
||||
@@ -831,12 +835,12 @@ void *mpu_ram_alloc(mm_space_t *ms, ram_limit_t *r_limit, size_t ram_size, int m
|
||||
#if CONFIG_MPU_VERSION == 1
|
||||
umword_t pre_alloc_addr;
|
||||
struct mem_heap *heap = NULL;
|
||||
umword_t status = cpulock_lock();
|
||||
// umword_t status = cpulock_lock();
|
||||
again_alloc:
|
||||
heap = mm_get_free_raw(mem_block, heap, ram_size, &pre_alloc_addr);
|
||||
if (!heap)
|
||||
{
|
||||
cpulock_set(status);
|
||||
// cpulock_set(status);
|
||||
printk("The system is low on memory.\n");
|
||||
// mm_trace();
|
||||
return NULL;
|
||||
@@ -848,7 +852,7 @@ again_alloc:
|
||||
if (mpu_calc(ms, pre_alloc_addr, ram_size,
|
||||
&need_align, &alloc_addr) == FALSE)
|
||||
{
|
||||
cpulock_set(status);
|
||||
// cpulock_set(status);
|
||||
printk("The MPU area is exhausted.");
|
||||
return NULL;
|
||||
}
|
||||
@@ -856,7 +860,7 @@ again_alloc:
|
||||
void *ram = mm_limit_alloc_align_raw(mem_block, r_limit, ram_size, need_align);
|
||||
if (!ram)
|
||||
{
|
||||
cpulock_set(status);
|
||||
// cpulock_set(status);
|
||||
printk("The system is low on memory.\n");
|
||||
return NULL;
|
||||
}
|
||||
@@ -864,13 +868,13 @@ again_alloc:
|
||||
//!< 申请的地址与预分配的地址不同
|
||||
if (ram != (void *)alloc_addr)
|
||||
{
|
||||
cpulock_set(status);
|
||||
// cpulock_set(status);
|
||||
printk("Again.\n");
|
||||
mm_limit_free_align_raw(mem_block, r_limit, ram, need_align);
|
||||
heap = heap->next;
|
||||
goto again_alloc;
|
||||
}
|
||||
cpulock_set(status);
|
||||
// cpulock_set(status);
|
||||
return ram;
|
||||
#elif CONFIG_MPU_VERSION == 2
|
||||
region_info_t *region;
|
||||
|
||||
@@ -127,9 +127,17 @@ void mm_trace(void)
|
||||
{
|
||||
mem_trace(&mem_manage[0]);
|
||||
}
|
||||
void mm_info_raw(int mem_inx, size_t *total, size_t *free)
|
||||
{
|
||||
if (mem_inx >= MEM_NODES_NUM)
|
||||
{
|
||||
return;
|
||||
}
|
||||
mem_info(&mem_manage[mem_inx], total, free);
|
||||
}
|
||||
void mm_info(size_t *total, size_t *free)
|
||||
{
|
||||
mem_info(&mem_manage[0], total, free);
|
||||
mm_info_raw(0, total, free);
|
||||
}
|
||||
void *mm_limit_alloc_align_raw(int mem_inx, ram_limit_t *limit, size_t size, size_t align)
|
||||
{
|
||||
|
||||
@@ -46,6 +46,10 @@ void put_bytes(const uint8_t *data, size_t len)
|
||||
|
||||
for (int i = 0; i < len; i++)
|
||||
{
|
||||
if (data[i] == '\n')
|
||||
{
|
||||
uart_putc(uart_get_global(), '\r');
|
||||
}
|
||||
uart_putc(uart_get_global(), data[i]);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "spinlock.h"
|
||||
#include "thread.h"
|
||||
#include "types.h"
|
||||
#include <assert.h>
|
||||
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
|
||||
#include <slab.h>
|
||||
static slab_t *sema_slab;
|
||||
@@ -77,7 +78,7 @@ void sema_up(sema_t *obj)
|
||||
}
|
||||
if (obj->max_cnt == 1 && obj->hold_th == &th->kobj)
|
||||
{
|
||||
//还原优先级
|
||||
// 还原优先级
|
||||
thread_set_prio(th, obj->hold_th_prio);
|
||||
obj->hold_th = NULL;
|
||||
}
|
||||
@@ -116,10 +117,10 @@ again:
|
||||
slist_add_append(&obj->suspend_head, &wait_item.node);
|
||||
if (obj->max_cnt == 1 && obj->hold_th)
|
||||
{
|
||||
if (thread_get_prio(th) > thread_get_prio((thread_t*)(obj->hold_th)))
|
||||
if (thread_get_prio(th) > thread_get_prio((thread_t *)(obj->hold_th)))
|
||||
{
|
||||
//执行优先级继承
|
||||
thread_set_prio(((thread_t*)(obj->hold_th)), thread_get_prio(th));
|
||||
// 执行优先级继承
|
||||
thread_set_prio(((thread_t *)(obj->hold_th)), thread_get_prio(th));
|
||||
}
|
||||
}
|
||||
remain_sleep = thread_sleep(ticks);
|
||||
@@ -211,7 +212,7 @@ static void sema_release_stage1(kobject_t *kobj)
|
||||
{
|
||||
sema_t *obj = container_of(kobj, sema_t, kobj);
|
||||
kobject_invalidate(kobj);
|
||||
#if 1
|
||||
#if 1
|
||||
umword_t status;
|
||||
status = spinlock_lock(&obj->lock);
|
||||
sema_wait_item_t *wait_item;
|
||||
@@ -232,7 +233,7 @@ static void sema_release_stage1(kobject_t *kobj)
|
||||
wait_item = next;
|
||||
}
|
||||
spinlock_set(&obj->lock, status);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
static bool_t sema_put(kobject_t *kobj)
|
||||
{
|
||||
|
||||
@@ -177,6 +177,7 @@ end:
|
||||
}
|
||||
static int share_mem_free_pmem(share_mem_t *obj)
|
||||
{
|
||||
task_t *cur_task = thread_get_current_task();
|
||||
assert(obj);
|
||||
switch (obj->mem_type)
|
||||
{
|
||||
@@ -189,7 +190,7 @@ static int share_mem_free_pmem(share_mem_t *obj)
|
||||
#if IS_ENABLED(CONFIG_MMU)
|
||||
mm_limit_free_buddy(obj->lim, obj->mem, obj->size);
|
||||
#else
|
||||
mm_limit_free_align(obj->lim, obj->mem, obj->size);
|
||||
mm_limit_free_align_raw(cur_task->mm_space.mem_block_inx, obj->lim, obj->mem, obj->size);
|
||||
#endif
|
||||
break;
|
||||
case SHARE_MEM_CNT_DPD:
|
||||
@@ -221,6 +222,7 @@ static int share_mem_free_pmem(share_mem_t *obj)
|
||||
static int share_mem_alloc_pmem(share_mem_t *obj)
|
||||
{
|
||||
int align_size = 0;
|
||||
task_t *cur_task = thread_get_current_task();
|
||||
|
||||
assert(obj);
|
||||
if (obj->mem)
|
||||
@@ -260,7 +262,7 @@ static int share_mem_alloc_pmem(share_mem_t *obj)
|
||||
align_size = sizeof(void *);
|
||||
#endif
|
||||
|
||||
obj->mem = mm_limit_alloc_align(obj->lim, obj->size, align_size);
|
||||
obj->mem = mm_limit_alloc_align_raw(cur_task->mm_space.mem_block_inx, obj->lim, obj->size, align_size);
|
||||
#endif
|
||||
if (obj->mem == NULL)
|
||||
{
|
||||
@@ -309,6 +311,8 @@ static int share_mem_alloc_pmem(share_mem_t *obj)
|
||||
static int share_mem_pmem_resize(share_mem_t *obj, size_t new_size)
|
||||
{
|
||||
int ret;
|
||||
task_t *cur_task = thread_get_current_task();
|
||||
|
||||
if (obj->mem)
|
||||
{
|
||||
return 0;
|
||||
@@ -324,7 +328,7 @@ static int share_mem_pmem_resize(share_mem_t *obj, size_t new_size)
|
||||
#if IS_ENABLED(CONFIG_MMU)
|
||||
mm_limit_free_buddy(obj->lim, obj->mem, ojb->size);
|
||||
#else
|
||||
mm_limit_free_align(obj->lim, obj->mem, obj->size);
|
||||
mm_limit_free_align_raw(cur_task->mm_space.mem_block_inx, obj->lim, obj->mem, obj->size);
|
||||
#endif
|
||||
obj->mem = NULL;
|
||||
break;
|
||||
@@ -541,14 +545,14 @@ static void share_mem_release_stage1(kobject_t *kobj)
|
||||
static void share_mem_release_stage2(kobject_t *kobj)
|
||||
{
|
||||
share_mem_t *sm = container_of(kobj, share_mem_t, kobj);
|
||||
|
||||
task_t *cur_task = thread_get_current_task();
|
||||
assert(dlist_is_empty(&sm->task_head));
|
||||
|
||||
#if IS_ENABLED(CONFIG_MMU)
|
||||
share_mem_free_pmem(sm);
|
||||
mm_limit_free_slab(share_mem_slab, sm->lim, sm);
|
||||
#else
|
||||
mm_limit_free_align(sm->lim, sm->mem, sm->size);
|
||||
mm_limit_free_align_raw(cur_task->mm_space.mem_block_inx, sm->lim, sm->mem, sm->size);
|
||||
mm_limit_free(sm->lim, sm);
|
||||
#endif
|
||||
printk("share mem 0x%x free.\n", sm);
|
||||
|
||||
@@ -111,10 +111,21 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag,
|
||||
break;
|
||||
case MEM_INFO:
|
||||
{
|
||||
size_t total;
|
||||
size_t free;
|
||||
size_t total = 0;
|
||||
size_t free = 0;
|
||||
|
||||
mm_info(&total, &free);
|
||||
for (int i = 0; i < arch_get_boot_info()->mem.mem_num; i++)
|
||||
{
|
||||
size_t item_total;
|
||||
size_t item_free;
|
||||
|
||||
printk("================================mem:[%d]=============================\n", i);
|
||||
mm_info_raw(i, &item_total, &item_free);
|
||||
printk("total:0x%x free:0x%x\n", item_total, item_free);
|
||||
printk("=====================================================================\n\n", i);
|
||||
total += item_total;
|
||||
free += item_free;
|
||||
}
|
||||
f->regs[1] = total;
|
||||
f->regs[2] = free;
|
||||
tag = msg_tag_init4(0, 0, 0, 0);
|
||||
|
||||
@@ -92,6 +92,7 @@ int task_alloc_base_ram(task_t *tk, ram_limit_t *lim, size_t size, int mem_block
|
||||
}
|
||||
memset(ram, 0, size + THREAD_MSG_BUG_LEN);
|
||||
mm_space_set_ram_block(&tk->mm_space, ram, size + THREAD_MSG_BUG_LEN);
|
||||
tk->mm_space.mem_block_inx = mem_block;
|
||||
printk("task alloc [0x%x - 0x%x]\n", ram, (umword_t)ram + size + THREAD_MSG_BUG_LEN - 1);
|
||||
return 0;
|
||||
}
|
||||
@@ -125,7 +126,9 @@ static void task_unlock_2(spinlock_t *sp0, spinlock_t *sp1, int status0, int sta
|
||||
{
|
||||
spinlock_set(sp0, status0);
|
||||
spinlock_set(sp1, status1);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
spinlock_set(sp0, status0);
|
||||
}
|
||||
}
|
||||
@@ -173,7 +176,9 @@ static int task_lock_2(spinlock_t *sp0, spinlock_t *sp1, int *st0, int *st1)
|
||||
}
|
||||
*st0 = status1;
|
||||
*st1 = status0;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
status0 = spinlock_lock(sp0);
|
||||
if (status0 < 0)
|
||||
{
|
||||
@@ -334,7 +339,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
|
||||
tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
||||
break;
|
||||
}
|
||||
mm_space_get_ram_block(&tag_task->mm_space, (void**)(&f->regs[1]), (size_t *)(&f->regs[2]));
|
||||
mm_space_get_ram_block(&tag_task->mm_space, (void **)(&f->regs[1]), (size_t *)(&f->regs[2]));
|
||||
spinlock_set(&tag_task->kobj.lock, status);
|
||||
tag = msg_tag_init4(0, 0, 0, 0);
|
||||
}
|
||||
@@ -405,13 +410,13 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i
|
||||
tag = msg_tag_init4(0, 0, 0, -EINVAL);
|
||||
break;
|
||||
}
|
||||
#if 0/*TODO: 需要检查动态申请的内存*/
|
||||
#if 0 /*TODO: 需要检查动态申请的内存*/
|
||||
if (!is_rw_access(tag_task, (void *)src_addr, copy_len, FALSE))
|
||||
{
|
||||
ret = -EPERM;
|
||||
goto copy_data_to_end;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
if (!is_rw_access(dst_task_obj, (void *)dst_addr, copy_len, FALSE))
|
||||
{
|
||||
ret = -EPERM;
|
||||
@@ -551,7 +556,9 @@ static void task_release_stage1(kobject_t *kobj)
|
||||
pf_t *cur_pf = ((pf_t *)((char *)restore_th + CONFIG_THREAD_BLOCK_SIZE + 8)) - 1;
|
||||
cur_pf->regs[5] = (umword_t)(thread_get_bind_task(restore_th)->mm_space.mm_block);
|
||||
ref_counter_dec_and_release(&tk->ref_cn, &tk->kobj);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -570,9 +577,10 @@ static void task_release_stage2(kobject_t *kobj)
|
||||
if (tk->mm_space.mm_block)
|
||||
{
|
||||
#if CONFIG_MPU
|
||||
mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size);
|
||||
mm_limit_free_align_raw(tk->mm_space.mem_block_inx, tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size);
|
||||
|
||||
#else
|
||||
mm_limit_free(tk->lim, tk->mm_space.mm_block);
|
||||
mm_limit_free_raw(tk->mm_space.mem_block_inx, tk->lim, tk->mm_space.mm_block);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -335,11 +335,7 @@ bool_t thread_sched(bool_t is_sche)
|
||||
if (is_sche)
|
||||
{
|
||||
// 立刻进行切换
|
||||
#if IS_ENABLED(CONFIG_MMU)
|
||||
sche_arch_sw_context();
|
||||
#else
|
||||
arch_to_sche();
|
||||
#endif
|
||||
}
|
||||
// printk("sched: cpu:%d sp:0x%lx\n", arch_get_current_cpu_id(), th->sp.sp);
|
||||
cpulock_set(status);
|
||||
@@ -407,9 +403,7 @@ void thread_ready(thread_t *th, bool_t is_sche)
|
||||
else
|
||||
{
|
||||
thread_sched(FALSE);
|
||||
arch_to_sche();
|
||||
}
|
||||
// printk("ready: th:0x%lx\n", th);
|
||||
cpulock_set(status);
|
||||
}
|
||||
/**
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
#!/bin/bash
|
||||
|
||||
export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
|
||||
export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
# export TOOLCHAIN=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/bin/
|
||||
# export TOOLCHAIN_LIB=/home/zhangzheng/toolchain/gcc-arm-10.3-2021.07-x86_64-arm-none-eabi/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
|
||||
# export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
|
||||
# export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
export TOOLCHAIN=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/bin/
|
||||
export TOOLCHAIN_LIB=/Users/zhangzheng/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
|
||||
# export TOOLCHAIN=/d/GNUArmEmbeddedToolchain/102021.10/bin/
|
||||
# export TOOLCHAIN_LIB=/d/GNUArmEmbeddedToolchain/102021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp
|
||||
|
||||
@@ -25,42 +25,42 @@ add_subdirectory(cutest)
|
||||
add_subdirectory(fd)
|
||||
|
||||
|
||||
add_custom_target(
|
||||
mkrtos_static_libc ALL
|
||||
#以下命令用于生成binutils链接需要的库
|
||||
COMMAND
|
||||
cd ${CMAKE_SOURCE_DIR}/build
|
||||
COMMAND
|
||||
rm -f -r usr_lib
|
||||
COMMAND
|
||||
mkdir -p usr_lib
|
||||
COMMAND
|
||||
find mkrtos_user -name "*.a" | xargs cp -t usr_lib
|
||||
COMMAND
|
||||
cd usr_lib
|
||||
COMMAND
|
||||
${CMAKE_AR} x libmuslc.a
|
||||
COMMAND
|
||||
${CMAKE_AR} x liblibc_be.a
|
||||
COMMAND
|
||||
${CMAKE_AR} x libsys.a
|
||||
COMMAND
|
||||
${CMAKE_AR} x libsys_svr.a
|
||||
COMMAND
|
||||
${CMAKE_AR} x libsys_util.a
|
||||
COMMAND
|
||||
${CMAKE_AR} x libutil.a
|
||||
COMMAND
|
||||
${CMAKE_AR} cr libnewc.a *.obj
|
||||
COMMAND
|
||||
rm *.obj
|
||||
)
|
||||
add_dependencies(
|
||||
mkrtos_static_libc
|
||||
muslc
|
||||
libc_be
|
||||
sys
|
||||
sys_svr
|
||||
sys_util
|
||||
util
|
||||
)
|
||||
# add_custom_target(
|
||||
# mkrtos_static_libc ALL
|
||||
# #以下命令用于生成binutils链接需要的库
|
||||
# COMMAND
|
||||
# cd ${CMAKE_SOURCE_DIR}/build
|
||||
# COMMAND
|
||||
# rm -f -r usr_lib
|
||||
# COMMAND
|
||||
# mkdir -p usr_lib
|
||||
# COMMAND
|
||||
# find mkrtos_user -name "*.a" | xargs cp -t usr_lib
|
||||
# COMMAND
|
||||
# cd usr_lib
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x libmuslc.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x liblibc_be.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x libsys.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x libsys_svr.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x libsys_util.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} x libutil.a
|
||||
# COMMAND
|
||||
# ${CMAKE_AR} cr libnewc.a *.obj
|
||||
# COMMAND
|
||||
# rm *.obj
|
||||
# )
|
||||
# add_dependencies(
|
||||
# mkrtos_static_libc
|
||||
# muslc
|
||||
# libc_be
|
||||
# sys
|
||||
# sys_svr
|
||||
# sys_util
|
||||
# util
|
||||
# )
|
||||
|
||||
@@ -75,11 +75,11 @@ int ls(int argc, char *agrv[])
|
||||
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), ls, ls, ls command);
|
||||
int cp(int argc, char *argv[])
|
||||
{
|
||||
#define BUFFER_SIZE 64
|
||||
#define BUFFER_SIZE 1024
|
||||
|
||||
int source_fd, target_fd;
|
||||
ssize_t bytes_read, bytes_written;
|
||||
char buffer[BUFFER_SIZE];
|
||||
char *buffer;
|
||||
int ret;
|
||||
|
||||
// 检查参数数量
|
||||
@@ -88,12 +88,19 @@ int cp(int argc, char *argv[])
|
||||
fprintf(stderr, "example: %s /bin/a.bin /mnt/a.bin\n", argv[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
// 分配缓冲区
|
||||
buffer = (char *)u_malloc(BUFFER_SIZE);
|
||||
if (buffer == NULL)
|
||||
{
|
||||
perror("malloc buffer is error.\n");
|
||||
return -1;
|
||||
}
|
||||
// 打开源文件
|
||||
source_fd = open(argv[1], O_RDONLY);
|
||||
if (source_fd == -1)
|
||||
{
|
||||
perror("can not open src file.\n");
|
||||
u_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
struct stat st = {0};
|
||||
@@ -106,11 +113,13 @@ int cp(int argc, char *argv[])
|
||||
{
|
||||
perror("can not open dest file.");
|
||||
close(source_fd);
|
||||
u_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
if (ftruncate(target_fd, st.st_size) < 0)
|
||||
{
|
||||
printf("to set fiel size is error.\n");
|
||||
u_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -123,6 +132,7 @@ int cp(int argc, char *argv[])
|
||||
perror("write file is error.\n");
|
||||
close(source_fd);
|
||||
close(target_fd);
|
||||
u_free(buffer);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@@ -135,7 +145,7 @@ int cp(int argc, char *argv[])
|
||||
// 关闭文件
|
||||
close(source_fd);
|
||||
close(target_fd);
|
||||
|
||||
u_free(buffer);
|
||||
printf("cp file is success.\n");
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1473,7 +1473,7 @@ void shellExec(Shell *shell)
|
||||
}
|
||||
if (shell->parser.param[shell->parser.paramCount - 1][0] == '@')
|
||||
{
|
||||
// 指定启动的mem,参数少一个
|
||||
// 指定启动的pid
|
||||
pid = atoi(&(shell->parser.param[shell->parser.paramCount - 1][1]));
|
||||
shell->parser.paramCount--;
|
||||
}
|
||||
|
||||
@@ -39,6 +39,30 @@
|
||||
|
||||
#define IS_ENABLED(option) __or(IS_BUILTIN(option), IS_MODULE(option))
|
||||
|
||||
static unsigned int mk_ffs(unsigned int x)
|
||||
{
|
||||
unsigned int ret;
|
||||
|
||||
__asm__ volatile("clz\t%0, %1"
|
||||
: "=r"(ret)
|
||||
: "r"(x)
|
||||
: "cc");
|
||||
ret = (sizeof(void *) * 8 - 1) - ret;
|
||||
return ret;
|
||||
}
|
||||
static inline unsigned long is_power_of_2(unsigned long num)
|
||||
{
|
||||
return (num & (num - 1)) == 0;
|
||||
}
|
||||
static inline unsigned long align_power_of_2(unsigned long num)
|
||||
{
|
||||
if (is_power_of_2(num))
|
||||
{
|
||||
return num;
|
||||
}
|
||||
return (1 << (mk_ffs(num) + 1));
|
||||
}
|
||||
|
||||
/* Import a binary file */
|
||||
#define IMPORT_BIN(sect, file, sym) asm (\
|
||||
".section " #sect "\n" /* Change section */\
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
#一次读取一行,每行代表启动的应用程序
|
||||
block /dev/block
|
||||
ram_block -p /dev/rblk -s 512 -n 2048 | 2
|
||||
appfs -m /bin -d /dev/block
|
||||
fatfs | 1
|
||||
fatfs -m /mnt -d /dev/rblk
|
||||
pin
|
||||
i2c
|
||||
pca9555
|
||||
display
|
||||
snd
|
||||
a_eth
|
||||
a_net
|
||||
# nes /bin/sm.nes
|
||||
a_net | 1
|
||||
# a_nes /bin/sm.nes
|
||||
sh
|
||||
@@ -15,7 +15,7 @@
|
||||
#define HEAP_SIZE (256 * 1024)
|
||||
#define STACK_SIZE (2 * 1024) //(1024 + 256)
|
||||
#else
|
||||
#define HEAP_SIZE (10 * 1024)
|
||||
#define HEAP_SIZE (1 * 1024)
|
||||
#define STACK_SIZE (2 * 1024) //(1024 + 256)
|
||||
#endif
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#include "ns.h"
|
||||
#ifdef MKRTOS
|
||||
#include <u_hd_man.h>
|
||||
#include <malloc.h>
|
||||
#include <u_malloc.h>
|
||||
#include <u_task.h>
|
||||
#endif
|
||||
// 其他进程可以注册节点进来,并且可以注册子节点进来,子节点可以注册更多的子节点进来。
|
||||
@@ -108,7 +108,7 @@ static ns_node_t *node_create(const char *name, node_type_t type, int pid)
|
||||
ns_node_t *tmp;
|
||||
|
||||
#ifdef MKRTOS
|
||||
tmp = calloc(sizeof(ns_node_t), 1);
|
||||
tmp = u_calloc(sizeof(ns_node_t), 1);
|
||||
#else
|
||||
tmp = calloc(sizeof(ns_node_t), 1);
|
||||
#endif
|
||||
@@ -258,7 +258,7 @@ int ns_delnode(const char *path)
|
||||
}
|
||||
cur_node->parent->ref--;
|
||||
#ifdef MKRTOS
|
||||
free(cur_node);
|
||||
u_free(cur_node);
|
||||
#else
|
||||
free(cur_node);
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <dirent.h>
|
||||
#include <malloc.h>
|
||||
#include <u_malloc.h>
|
||||
#include <u_mutex.h>
|
||||
#include <u_hd_man.h>
|
||||
#include "ns.h"
|
||||
@@ -498,7 +498,7 @@ void fs_ns_del_file_by_pid(const char *path, pid_t pid)
|
||||
int path_len;
|
||||
|
||||
path_len = strlen(path) + 64;
|
||||
new_path = malloc(path_len);
|
||||
new_path = u_malloc(path_len);
|
||||
if (new_path == NULL)
|
||||
{
|
||||
return;
|
||||
@@ -507,7 +507,7 @@ void fs_ns_del_file_by_pid(const char *path, pid_t pid)
|
||||
fd = fs_ns_open(path, O_RDONLY, 0);
|
||||
if (fd < 0)
|
||||
{
|
||||
free(new_path);
|
||||
u_free(new_path);
|
||||
return;
|
||||
}
|
||||
while (1)
|
||||
@@ -540,6 +540,6 @@ void fs_ns_del_file_by_pid(const char *path, pid_t pid)
|
||||
fs_ns_remove(new_path);
|
||||
}
|
||||
}
|
||||
free(new_path);
|
||||
u_free(new_path);
|
||||
fs_ns_close(fd);
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
#include "u_sig.h"
|
||||
#include "pm.h"
|
||||
#include "parse_cfg.h"
|
||||
#include "malloc.h"
|
||||
#include "u_malloc.h"
|
||||
#include "nsfs.h"
|
||||
#include "sig_cli.h"
|
||||
#include "tty.h"
|
||||
@@ -133,7 +133,7 @@ static void pm_del_watch_by_pid(pm_t *pm, pid_t pid)
|
||||
{
|
||||
slist_del(&pos->node);
|
||||
handler_free_umap(pos->sig_hd);
|
||||
free(pos);
|
||||
u_free(pos);
|
||||
}
|
||||
pos = next;
|
||||
}
|
||||
@@ -162,7 +162,7 @@ int pm_rpc_watch_pid(pm_t *pm, obj_handler_t sig_rcv_hd, pid_t pid, int flags)
|
||||
fflush(stdout);
|
||||
return -EEXIST;
|
||||
}
|
||||
watch_entry_t *entry = (watch_entry_t *)malloc(sizeof(watch_entry_t));
|
||||
watch_entry_t *entry = (watch_entry_t *)u_malloc(sizeof(watch_entry_t));
|
||||
|
||||
if (!entry)
|
||||
{
|
||||
@@ -220,7 +220,7 @@ static void pm_send_sig_to_task(pm_t *pm, pid_t pid, umword_t sig_val)
|
||||
slist_del(&pos->node);
|
||||
handler_free_umap(pos->sig_hd); //!< 删除信号通知的ipc
|
||||
// handler_free_umap(pos->watch_pid); //!< 删除被watch的进程
|
||||
free(pos);
|
||||
u_free(pos);
|
||||
}
|
||||
pos = next;
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#include "pm.h"
|
||||
#include "pm_svr.h"
|
||||
#include "u_sig.h"
|
||||
#define CONS_STACK_SIZE 2048
|
||||
#define CONS_STACK_SIZE (1024+512)
|
||||
static ATTR_ALIGN(8) uint8_t cons_stack[CONS_STACK_SIZE];
|
||||
static uint8_t cons_ipc_msg[MSG_BUG_LEN];
|
||||
static tty_struct_t sys_tty;
|
||||
|
||||
@@ -47,7 +47,7 @@ static err_t low_level_init(struct netif *netif)
|
||||
tag = u_facotry_create_share_mem(FACTORY_PROT,
|
||||
vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, send_shm_hd), SHARE_MEM_CNT_BUDDY_CNT,
|
||||
2048);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
assert(msg_tag_get_prot(tag) >= 0 && "share mem alloc failed.");
|
||||
tag = u_share_mem_map(send_shm_hd, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_RESV, 0),
|
||||
&send_shm_addr, &send_shm_size);
|
||||
assert(msg_tag_get_prot(tag) >= 0);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include <u_types.h>
|
||||
#if !IS_ENABLED(CONFIG_MMU)
|
||||
#define HEAP_SIZE 16 * 1024
|
||||
#define HEAP_SIZE 8 * 1024
|
||||
#define STACK_SIZE (2 * 1024)
|
||||
|
||||
#if defined(__CC_ARM)
|
||||
|
||||
BIN
mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/hdl.nes
Normal file
BIN
mkrtos_user/user/app/ATSURFF437/nes_simulator/nes_rom/hdl.nes
Normal file
Binary file not shown.
@@ -526,15 +526,21 @@ void nes_emulate_frame(void)
|
||||
extern bool_t print_fps;
|
||||
int32_t used_tick = sys_read_tick() - st_tick;
|
||||
|
||||
// if (1000 / 60 >= used_tick)
|
||||
// {
|
||||
// usleep((1000 / 60 - used_tick) * 1000);
|
||||
// }
|
||||
if (1000 / 60 >= used_tick)
|
||||
{
|
||||
usleep((1000 / 60 - used_tick) * 1000);
|
||||
}
|
||||
used_tick = sys_read_tick() - st_tick;
|
||||
if (print_fps)
|
||||
{
|
||||
static int i = 0;
|
||||
|
||||
i++;
|
||||
if (i % 30 == 0)
|
||||
{
|
||||
printf("fps:%d\n", 1000 / used_tick);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
* @version V1.1
|
||||
* @date 2022-05-31
|
||||
* @brief NES PPU ????
|
||||
* ???????????????ye781205??NES?????????, ????<3F><>!
|
||||
* ???????????????ye781205??NES?????????, ????<3F><>!
|
||||
* @license Copyright (c) 2020-2032, ??????????????????????
|
||||
****************************************************************************************************
|
||||
* @attention
|
||||
@@ -116,8 +116,8 @@ uint32 VRAM_accessible()
|
||||
// uint8* get_VROM_tiles() { return VROM_tiles; }
|
||||
|
||||
// #define MASK_BANK(bank,mask) (bank) = ((bank) & (mask))
|
||||
// #define VALIDATE_VROM_BANK(bank) \
|
||||
// MASK_BANK(bank,VROM_mask); \
|
||||
// #define VALIDATE_VROM_BANK(bank)
|
||||
// MASK_BANK(bank,VROM_mask);
|
||||
// if((bank) >= (RomHeader->num_8k_vrom_banks * 8)) return;
|
||||
|
||||
//****************************************************************************************************
|
||||
@@ -410,7 +410,7 @@ void do_scanline_and_draw(uint8 *buf)
|
||||
}
|
||||
else
|
||||
{
|
||||
// clear out solid buffer??????<3F><>????
|
||||
// clear out solid buffer??????<3F><>????
|
||||
memset(ppu->solid_buf, 0x00, sizeof(ppu->solid_buf));
|
||||
}
|
||||
|
||||
@@ -595,7 +595,7 @@ void write_2007(uint8 data)
|
||||
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
|
||||
*(TILE(addr) + (addr & 0xf )) = data;//************************
|
||||
#else
|
||||
@@ -833,7 +833,7 @@ void PPU_WriteToPort(uint8 data, uint16 addr )
|
||||
uint32 attrib_addr;
|
||||
uint32 attrib_bits;
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
uint8 pattern_lo;
|
||||
uint8 pattern_hi;
|
||||
uint8 pattern_mask;
|
||||
@@ -872,7 +872,7 @@ void PPU_WriteToPort(uint8 data, uint16 addr )
|
||||
|
||||
// CHECK_MMC2(pattern_addr);//*******************************************************
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
data = TILE(pattern_addr) + line;
|
||||
|
||||
pattern_lo = *data;
|
||||
@@ -980,7 +980,7 @@ void PPU_WriteToPort(uint8 data, uint16 addr )
|
||||
|
||||
uint32 spr_height;
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
|
||||
uint8 pattern_lo;
|
||||
uint8 pattern_hi;
|
||||
@@ -1078,7 +1078,7 @@ void PPU_WriteToPort(uint8 data, uint16 addr )
|
||||
tile_addr += ppu->spr_pattern_table_addr;
|
||||
}
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
t = TILE(tile_addr) + line;
|
||||
|
||||
pattern_lo = *t;
|
||||
@@ -1095,11 +1095,11 @@ void PPU_WriteToPort(uint8 data, uint16 addr )
|
||||
{
|
||||
//uint8 col = 0x00;
|
||||
|
||||
// if a sprite has drawn on this pixel, don't draw anything??????????????????????,?????<3F>ʦ<EFBFBD>???
|
||||
// if a sprite has drawn on this pixel, don't draw anything??????????????????????,?????<3F>ʦ<EFBFBD>???
|
||||
if (!((*solid) & SPR_WRITTEN_FLAG))
|
||||
{
|
||||
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
#if NES_RAM_SPEED==1 //1:??????<3F><> 0:????
|
||||
|
||||
col = ((pattern_hi >> (7 - x) << 1) & 2) | ((pattern_lo >> (7 - x)) & 1);
|
||||
#else
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -77,7 +77,7 @@ int flash_write_sector(uint32_t sector_inx, uint32_t *p_buffer, uint16_t num_wri
|
||||
}
|
||||
|
||||
flash_unlock();
|
||||
status = flash_sector_erase(sector_inx * SECTOR_SIZE + sys_info.bootfs_start_addr);
|
||||
status = flash_sector_erase(write_addr);
|
||||
if (status != FLASH_OPERATE_DONE)
|
||||
{
|
||||
flash_lock();
|
||||
@@ -109,8 +109,8 @@ int flash_init(void)
|
||||
return msg_tag_get_val(tag);
|
||||
}
|
||||
|
||||
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RW, VMA_ADDR_PAGE_FAULT_SIM, 0),
|
||||
32 * 1024 * 1024 /*TODO:*/, 0x8000000, &vaddr);
|
||||
tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RWX, VMA_ADDR_PAGE_FAULT_SIM, 0),
|
||||
align_power_of_2(CONFIG_SYS_TEXT_SIZE), CONFIG_SYS_TEXT_ADDR, &vaddr);
|
||||
if (msg_tag_get_val(tag) < 0)
|
||||
{
|
||||
return msg_tag_get_val(tag);
|
||||
|
||||
@@ -873,7 +873,7 @@ void lcd_color_fill(uint16_t sx, uint16_t sy, uint16_t ex, uint16_t ey, uint16_t
|
||||
*/
|
||||
void lcd_num_show(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t size, int32_t num, uint8_t num_bit)
|
||||
{
|
||||
uint8_t i, buf[12], start;
|
||||
uint8_t i, buf[12], start = 0;
|
||||
|
||||
buf[11] = 0;
|
||||
|
||||
|
||||
@@ -149,7 +149,7 @@ int fs_svr_open(const char *path, int flags, int mode)
|
||||
|
||||
int fs_svr_read(int fd, void *buf, size_t len)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
|
||||
|
||||
if (!fdp)
|
||||
@@ -171,7 +171,7 @@ int fs_svr_read(int fd, void *buf, size_t len)
|
||||
}
|
||||
int fs_svr_write(int fd, void *buf, size_t len)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
|
||||
|
||||
if (!fdp)
|
||||
@@ -188,6 +188,7 @@ int fs_svr_write(int fd, void *buf, size_t len)
|
||||
{
|
||||
ret = char_dev->ops->write(char_dev->dev, buf, len, &fdp->offset);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void fs_svr_close(int fd)
|
||||
{
|
||||
|
||||
@@ -144,6 +144,7 @@ again:
|
||||
/* config i2c */
|
||||
i2c_init(hi2c->i2cx, 0x0F, PCA_I2C_CLKCTRL_400K);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static int i2c_bus_configure(mk_i2c_t *drv, umword_t freq)
|
||||
{
|
||||
|
||||
@@ -149,7 +149,7 @@ int fs_svr_open(const char *path, int flags, int mode)
|
||||
|
||||
int fs_svr_read(int fd, void *buf, size_t len)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
|
||||
|
||||
if (!fdp)
|
||||
@@ -171,7 +171,7 @@ int fs_svr_read(int fd, void *buf, size_t len)
|
||||
}
|
||||
int fs_svr_write(int fd, void *buf, size_t len)
|
||||
{
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
file_desc_t *fdp = fd_get(thread_get_src_pid(), fd);
|
||||
|
||||
if (!fdp)
|
||||
@@ -188,6 +188,7 @@ int fs_svr_write(int fd, void *buf, size_t len)
|
||||
{
|
||||
ret = char_dev->ops->write(char_dev->dev, buf, len, &fdp->offset);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void fs_svr_close(int fd)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user