diff --git a/1.log b/1.log deleted file mode 100644 index f17ad3421..000000000 --- a/1.log +++ /dev/null @@ -1,888 +0,0 @@ -[ 0]: ==============================sys flash layer info============================ -[ 0]: [0] [0x8000000 0x8001fff] bootstrap 8192B -[ 0]: [1] [0x8002000 0x8003fff] dtbo 8192B -[ 0]: [2] [0x8004000 0x801ffff] kernel 114688B -[ 0]: [3] [0x8020000 0x87fffff] bootfs 8257536B -[ 0]: ======================================================================= -[ 0]: ==============================sys flash info============================ -[ 0]: [0] [0x8000000 0x87fffff] 8388608B -[ 0]: ======================================================================= -[ 0]: ==============================sys mem info============================ -[ 0]: [0] [0x20000000 0x21ffffff] 33554432B -[ 0]: ======================================================================= -[ 0]: init dts parsing. -[ 0]: fdt_size:414 -[ 0]: 0xd00dfeed 0x11 -[ 0]: total mem size:33545896. -[ 0]: sema init cnt:1 max:1. -[ 0]th_knl: ================ -[ 0]th_knl: start heap:0x20002154. -[ 0]th_knl: l heap:0x20002154. -[ 0]th_knl: end heap:0x21ffffe8. -[ 0]th_knl: 0 [0x20002154-] 33545856B -[ 0]th_knl: mem total size:33545876. -[ 0]th_knl: ================ -[ 0]th_knl: create thread 0x20002800 -[ 0]th_knl: sema init cnt:1 max:1. -[ 0]th_knl: create task is 0x20002200 -[ 0]th_knl: init task text is 0x808c000. -[ 0]th_knl: task alloc [0x20004000 - 0x2000c197] -[ 0]th_knl: mkrtos init done.. -[ 0]th_knl: mkrtos running.. -[ 0]th_knl: sys freq:120000000 -[ 0]th_knl: _____ ______ ___ __ ________ _________ ________ ________ -[ 0]th_knl: |\ _ \ _ \|\ \|\ \ |\ __ \|\___ ___\\ __ \|\ ____\ -[ 0]th_knl: \ \ \\\__\ \ \ \ \/ /|\ \ \|\ \|___ \ \_\ \ \|\ \ \ \___|_ -[ 0]th_knl: \ \ \\|__| \ \ \ ___ \ \ _ _\ \ \ \ \ \ \\\ \ \_____ \ -[ 0]th_knl: \ \ \ \ \ \ \ \\ \ \ \ \\ \| \ \ \ \ \ \\\ \|____|\ \ -[ 0]th_knl: \ \__\ \ \__\ \__\\ \__\ \__\\ _\ \ \__\ \ \_______\____\_\ \ -[ 0]th_knl: \|__| \|__|\|__| \|__|\|__|\|__| \|__| \|_______|\_________\ -[ 0]th_knl: \|_________| -[ 0]th_knl: Complie Time:Mar 8 2025 22:49:37 -[ 11]: sema init cnt:1 max:1. -stack 0x200055c0 1800 -stack 0x20006dc0 1800 -[ 27]: sema init cnt:2 max:2. -init.. -[ 33]th_init: sema init cnt:1 max:1. -[ 43]th_init: sema init cnt:1 max:1. -[ 44]th_init: sema init cnt:0 max:1. -[ 45]th_init: create thread 0x2000d800 -cons init... -cmd_line:block /dev/block -parse_cfg args[0] = block -parse_cfg args[1] = /dev/block -parse_cfg cmd_params_num:2 -block addr is [0x806a000] -[ 59]th_init: sema init cnt:1 max:1. -[ 59]th_init: create task is 0x2000ede4 -[ 61]th_init: create thread 0x2000f800 -[ 61]th_init: sema init cnt:0 max:1. -[ 62]th_init: task alloc [0x20011000 - 0x2001523b] -stack:0x200119f0 size:1536. -app_load 1 cp_args:0x20011fd0 -app_load 1 cp_args:0x20011fc4 -app_load 2 cp_args:0x20011fc4 -app_load 2 cp_args:0x20011fd0 -pid:26 stack:0x20011f90 -cmd_line:appfs -m /bin -d /dev/block -parse_cfg args[0] = appfs -parse_cfg args[1] = -m -parse_cfg args[2] = /bin -parse_cfg args[3] = -d -parse_cfg args[4] = /dev/block -parse_cfg cmd_params[ 83]: sema init cnt:0 max:1. -_num:5 -appfs addr is [0x8056000] -[ 86]th_init: sema init cnt:1 max:1. -[ 86]th_init: create task is 0x2000f194 -[ 88]th_init: create thread 0x20015800 -[ 88]th_init: sema init cnt:0 max:1. -[ 90]th_init: task alloc [0x20017000 - 0x2001c43b] -stack:0x20018610 size:2048. -app_load 1 cp_args:0x20018df0 -app_load 1 cp_args:0x20018dec -app_load 1 cp_args:0x20018de4 -app_load 1 cp_args:0x20018de0 -app_load 1 cp_args:0x20018dd4 -app_load 2 cp_args:0x20018dd4 -app_load 2 cp_args:0x20018de0 -app_load 2 cp_args:0x20018de4 -app_load 2 cp_args:0x20018dec -app_load 2 cp_args:0x20018df0 -pid:27 stack:0x20018d90 -cmd_line:sh -parse_cfg args[0] = sh -parse_cfg tty init... -cmd_params_num:1 -sh addr is [0x80b1000] -[ 113]th_init: sema init cnt:1 max:1. -[ 113]th_init: create task is 0x200100d8 -[ 116]th_init: create thread 0x2001c800 -[ 116]th_init: sema init cnt:0 max:1. -[ 119]th_init: task alloc [0x2001e000 - 0x20026d77] -[ 121]: sema init cnt:1 max:1. -stack:0x20022a08 size:2048. -app_load 1 cp_args:0x200231ec -app_load 2 cp_args:0x200231ec -pid:29 stack:0x200231b8 -[ 129]: sema init cnt:0 max:1. -run app num is 3. -tty init... -tty init... -tty init... -tty init... -[ 147]: sema init cnt:0 max:1. -tty init... -tty init... -[ 155]: sema init cnt:1 max:1. -tty init... -block init.. -tty init... -tty init...[ 172]: sema init cnt:1 max:1. - -tty init.stack 0x2001200.. -tty init... -0 800 -tty init... -[ 183]th_blk: sema init cnt:1 max:1. -tty init... -register [/dev/blocktty init... -] success. -args[0]:appfs -args[1]:-msh ipc init. - -args[2]:/bin -args[3]:-d -stack 0x20023208 800args[4]:/dev/block -[ 214]: sema init cnt:1 max:1. - -tty init... -tty init... -stack 0x20018e38 800tty init... - -[ 221]th_appf: sema init cnt:1 max:1. -args[0]:sh -mount path:/bin - -flash mem_addr:0x8020000 blk_size:0x1000 blk_nr:0x7e0mkrtos: -/$ [ 244]th_appf: share mem:[0x20028000 0x20029000] -block_buf addr:0x20028000 -register [/bin] success. -[ 253]th_knl: knl main run.. - -mkrtos:/$ vi /bin/init.cfg -pm run vi. -params[1]: /bin/init.cfg -vi addr is [0x80e7000] -[ 3994]th_shel: sema init cnt:1 max:1. -[ 3994]th_shel: create task is 0x20016a90 -[ 3995]th_shel: create thread 0x20029800 -[ 3996]th_shel: sema init cnt:0 max:1. -[ 3997]th_shel: task alloc [0x20030000 - 0x20053a67] -stack:0x20050480 size:3072. -app_load 1 cp_args:0x20051064 -app_load 1 cp_args:0x20051054 -app_load 2 cp_args:0x20051054 -app_load 2 cp_args:0x20051064 -pid:38 stack:0x20051020 -[pm] watch pid:38, sig hd:37[ 4028]: sema init cnt:0 max:1. -. -tty init... -[ 4051]: sema init cnt:1 max:1. -tty init... -tty init... -tty init... -tty init... -tty init... -vi running.. -[pm] watch pid:38, sig hd:39. -[?1049h#一次读取一行,每行代表启动的应用程序block /dev/blockappfs -m /bin -d /dev/block# cpiofs -m /bin# fatfs# pin# i2c# pca9555# display# eth# snd# net# nessh~~~~~~~~~- /bin/init.cfg 1/13 7%I /bin/init.cfg 1/13 7%I /bin/init.cfg 2/13 15%I /bin/init.cfg 4/13 30%I /bin/init.cfg 5/13 38%I /bin/init.cfg 7/13 53% I /bin/init.cfg [Modified] 7/13 53%  - /bin/init.cfg [Modified] 7/13 53%:wqpm wath pid -17 err. -'/bin/init.cfg' 13L, 0C[?1049lwatch_pid:38 pid:38 - -mkrtos:/watch_pid:38 pid:38 -$ [pm] kill pid:38 code:0. -[ 9660]: futex_unmap:664 -[ 9660]: sema 0x20016268 free. -[ 9660]: sema 0x20015754 free. -[ 9660]: sema 0x20010f6c free. -[ 9660]: release thread 0x20029800, name: -[ 9660]: release tk 20016a90, name is: - -mkrtos:/$ -mkrtos:/$ -mkrtos:/$ ls -bin 0B -sys 0B -dev 0B -Return: 0, 0x00000000 - -mkrtos:/$ cat /bin/init.cfg -[pm] watch pid:29, sig hd:39. -#一次读取一行,每行代表启动的应用程序 -block /dev/block -appfs -m /bin -d /dev/block -# cpiofs -m /bin -# fatfs -# pin -# i2c -# pca9555 -# display -# eth -# snd -# net -# nes -shReturn: 0, 0x00000000 - -mkrtos:/$ l ls -bin 0B -sys 0B -dev 0B -Return: 0, 0x00000000 - -mkrtos:/$ fatfs & -pm run fatfs. -params[1]: & -fatfs addr is [0x8077000] -[ 1067988]th_shel: sema init cnt:1 max:1. -[ 1067988]th_shel: create task is 0x2001c454 -[ 1067989]th_shel: create thread 0x2002a800 -[ 1067990]th_shel: sema init cnt:0 max:1. -[ 1067991]th_shel: task alloc [0x20030000 - 0x200551f7] -stack:0x200306a0 size:2048. -app_load 1 cp_args:0x20030e80 -app_load 1 cp_args:0x20030e7c -app_load 2 cp_args:0x20030e7c -app_load 2 cp_args:0x20030e80 -pid:44 stack:0x20030e48 - -mkrtos:/$ [ 1068021]: sema init cnt:0 max:1. -tty init... -[ 1068035]: sema init cnt:1 max:1. -tty init... -tty init... -tty init... -tty init... -tty init... -stack 0x20030f38 800 -[ 1068060]: sema init cnt:1 max:1. -[ 1068062]: sema init cnt:1 max:1. -register [/mnt] success. -ls -mnt 0B -bin 0B -sys 0B -dev 0B -Return: 0, 0x00000000 - -mkrtos:/$ cd mnt -Return: 0, 0x00000000 - -mkrtos:/$ ls -[pm] watch pid:29, sig hd:50. -Return: 0, 0x00000000 - -mkrtos:/$ vi    vi /mnt/1.txt -pm run vi. -params[1]: /mnt/1.txt -vi addr is [0x80e7000] -[ 1075431]th_shel: sema init cnt:1 max:1. -[ 1075431]th_shel: create task is 0x2001dc90 -[ 1075432]th_shel: create thread 0x2002d800 -[ 1075433]th_shel: sema init cnt:0 max:1. -[ 1075434]th_shel: task alloc [0x20058000 - 0x2007ba67] -stack:0x20078480 size:3072. -app_load 1 cp_args:0x20079064 -app_load 1 cp_args:0x20079058 -app_load 2 cp_args:0x20079058 -app_load 2 cp_args:0x20079064 -pid:52 stack:0x20079028 -[ 1075443]: sema init cnt:0 max:1. -tty init... -[ 1075459]: sema init cnt:1 max:1. -[pm] watcttyh pid:52, sig hd:51. - init... -tty init... -tty init... -tty init... -tty init... -vi running.. -[?1049h~~~~~~~~~~~~~~~~~~~~~~- /mnt/1.txt 1/1 100%I /mnt/1.txt 1/1 100% I /mnt/1.txt [Modified] 2/2 100%v intmain(void) I /mnt/1.txt [Modified] 3/3 100%[ { I /mnt/1.txt [Modified] 4/4 100%return0; I /mnt/1.txt [Modified] 5/5 100%}- /mnt/1.txt [Modified] 5/5 100%- /mnt/1.txt [Modified] 5/5 100%:wqpm wath pid -17 err. -'/mnt/1.txt' 5L, 30C[?1049lwatch_pid:29 pid:52 -watch_pid:29 pid:52 -watch_pid:52 pid:52 - -mkrtos:/[pm] kil$ l pid:52 code:0. -[ 1089576]: futex_unmap:664 -[ 1089576]: sema 0x2001d87c free. -[ 1089576]: sema 0x2001c734 free. -[ 1089576]: sema 0x2001679c free. -[ 1089576]: release thread 0x2002d800, name: -[ 1089576]: release tk 2001dc90, name is: - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ cat 1.txt -pm wath pid -17 err. - -int main(void) -{ -return 0; -} -Return: 0, 0x00000000 - -mkrtos:/$ a_net & -pm run a_net. -params[1]: & -a_net addr is [0x8025000] -[ 1128781]th_shel: sema init cnt:1 max:1. -[ 1128781]th_shel: create task is 0x2001dce0 -[ 1128782]th_shel: create thread 0x20055800 -[ 1128783]th_shel: sema init cnt:0 max:1. -[ 1128784]th_shel: task alloc [0x20058000 - 0x20072ac7] -stack:0x2005cfc8 size:2048. -app_load 1 cp_args:0x2005d7a8 -app_load 1 cp_args:0x2005d7a4 -app_load 2 cp_args:0x2005d7a4 -app_load 2 cp_args:0x2005d7a8 -pid:51 stack:0x2005d770 - -mkrtos:/$ [ 1128812]: sema init cnt:0 max:1. -tty init... -[ 1128826]: sema init cnt:1 max:1. -tty init... -tty init... -[ 1128839]: sema init cnt:1 max:1. -[ 1128840]: sema init cnt:1 max:1. -tty init... -tty init... -tty init... -net startup.. -stack 0x2005d7e8 800 -stack 0x2005dfe8 800 -stack 0x2005e7e8 800 -stack 0x2005efe8 800 -[ 1128864]th_net: sema init cnt:4 max:4. - -mkrtos:/$ -mkrtos:/$ -mkrtos:/$ ip:192.168.3.10 -netmask:255.255.255. -gw:192.168.3.1 -[ 1129919]th_net: sema init cnt:1 max:1. -[ 1129928]th_net: sema init cnt:0 max:2147483647. -[ 1129929]th_net: sema init cnt:0 max:2147483647. -[ 1129930]th_net: sema init cnt:1 max:2147483647. -[ 1129932]th_net: sema init cnt:1 max:1. -[ 1129937]th_net: create thread 0x20056800 -[ 1129947]th_net: share mem:[0x20073000 0x20073800] -lregister [/sys/net] success. -s -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ sys -sys: - cpu usage:0.0 -Return: 0, 0x00000000 - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ clear - -mkrtos:/$ ls -pm wath pid -17 err. -1.txt 30B -Return: 0, 0x00000000 - -mkrtos:/$ -mkrtos:/$ -mkrtos:/$ -mkrtos:/$ -mkrtos:/$ gea   a game 240  048 -[?25l2048.c 0 pts - -     - ·  ·  ·  ·  -     -     - 2  4  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 0 pts - -     - 2  4  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 0 pts - -     - 2  4  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  2  ·  -     - - ←,↑,→,↓ or q -2048.c 0 pts - -     - 2  4  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - 2  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 0 pts - -     - 2  4  ·  2  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - 2  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 4 pts - -     - 4  4  ·  2  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 4 pts - -     - 4  4  ·  2  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  2  -     - - ←,↑,→,↓ or q -2048.c 12 pts - -     - 8  2  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - 2  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 12 pts - -     - 8  2  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  2  ·  -     -     - 2  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 12 pts - -     - 8  2  2  ·  -     -     - 2  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 12 pts - -     - 8  2  2  ·  -     -     - 2  ·  ·  ·  -     -     - ·  ·  2  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 16 pts - -     - 8  4  ·  ·  -     -     - 2  ·  ·  ·  -     -     - 2  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 16 pts - -     - 8  4  ·  ·  -     -     - 2  ·  ·  ·  -     -     - 2  ·  ·  ·  -     -     - ·  ·  2  ·  -     - - ←,↑,→,↓ or q -2048.c 20 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 20 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - 2  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 20 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - 2  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 20 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - 2  ·  2  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 24 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - 4  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 24 pts - -     - 8  4  2  ·  -     -     - 4  ·  ·  ·  -     -     - 4  ·  ·  ·  -     -     - ·  ·  2  ·  -     - - ←,↑,→,↓ or q -2048.c 36 pts - -     - 8  4  4  ·  -     -     - 8  ·  ·  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 36 pts - -     - 8  4  4  ·  -     -     - 8  ·  2  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 52 pts - -     - 16  4  4  ·  -     -     - ·  ·  2  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  ·  ·  -     - - ←,↑,→,↓ or q -2048.c 52 pts - -     - 16  4  4  ·  -     -     - ·  ·  2  ·  -     -     - ·  ·  ·  ·  -     -     - ·  ·  2  ·  -     - - ←,↑,→,↓ or q - QUIT? (y/n) -[?25h -mkrtos:/$ game pushbox -[?25l - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■ ★★● ■ - ■ ■● ■ - ■ ♀ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■ ★★● ■ - ■ ■● ■ - ■ ♀ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■ ★★● ■ - ■ ■● ■ - ■♀ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■ ★★● ■ - ■♀ ■● ■ - ■ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■♀★★● ■ - ■ ■● ■ - ■ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■♀ ■■● ■ - ■ ★★● ■ - ■ ■● ■ - ■ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★♀■■● ■ - ■ ★★● ■ - ■ ■● ■ - ■ ■■■ - ■■■■■ -w,a,s,d or q - - LetterShell PushBox! - ■■■■■■ - ■ ■■ - ■★ ■■● ■ - ■ ♀★● ■ - ■ ■● ■ - ■ ■■■ - ■■■■■ -w,a,s,d or q -[?25l -mkrtos:/$ clear - -mkrtos:/$ he  help - -Command List: -ls CMD -------- ls command -rm CMD -------- rm command -cd CMD -------- cd command -pwd CMD -------- pwd command -cat CMD -------- cat command -hex CMD -------- hex command -kill CMD -------- kill command -symlink CMD -------- symlink command -touch CMD -------- touch command -mkdir CMD -------- mkdir command -reboot CMD -------- reboot command -free CMD -------- free command -sys CMD -------- sys command -exit CMD -------- exit command -test_sig CMD -------- shell_test_sig command -setVar CMD -------- set var -help CMD -------- show command info -users CMD -------- list all user -cmds CMD -------- list all cmd -vars CMD -------- list all var -keys CMD -------- list all key -clear CMD -------- clear console -logSetLevel CMD -------- set log level -hexdump CMD -------- hex dump -game CMD -------- games - -mkrtos:/$ \ No newline at end of file diff --git a/mkrtos_knl/arch/cortex-m/core_it.c b/mkrtos_knl/arch/cortex-m/core_it.c index 0b7220b4b..964f5c693 100755 --- a/mkrtos_knl/arch/cortex-m/core_it.c +++ b/mkrtos_knl/arch/cortex-m/core_it.c @@ -112,6 +112,7 @@ void MemManage_Handler(void) } return; } + printk("error SCB->CFSR:0x%x.\n", SCB->CFSR); if ((SCB->CFSR & 8)) { SCB->CFSR |= 8; diff --git a/mkrtos_knl/inc/knl/sleep.h b/mkrtos_knl/inc/knl/sleep.h index 105478244..9bf1f832a 100644 --- a/mkrtos_knl/inc/knl/sleep.h +++ b/mkrtos_knl/inc/knl/sleep.h @@ -6,6 +6,7 @@ typedef struct thread_wait_entry slist_head_t node; thread_t *th; umword_t times; + umword_t times_debug; } thread_wait_entry_t; void thread_check_timeout(void); thread_wait_entry_t *thread_sleep_del(thread_t *th); diff --git a/mkrtos_knl/knl/sleep.c b/mkrtos_knl/knl/sleep.c index c65904c11..a2423dc57 100644 --- a/mkrtos_knl/knl/sleep.c +++ b/mkrtos_knl/knl/sleep.c @@ -25,6 +25,7 @@ static inline void thread_wait_entry_init(thread_wait_entry_t *entry, slist_init(&entry->node); entry->th = th; entry->times = times; + entry->times_debug = 0; } static void thread_timeout_init(void) { @@ -47,6 +48,8 @@ void thread_check_timeout(void) thread_wait_entry_t *next = slist_next_entry( pos, (slist_head_t *)wait_list, node); + + pos->times_debug++; if (pos->times != 0) { pos->times--; @@ -57,6 +60,10 @@ void thread_check_timeout(void) thread_ready(pos->th, TRUE); } } // !< 如果是0,则一直休眠 + if (pos->times_debug%2000 == 0) + { + // printk("thread 0x%x block %d sec.\n", pos->th, pos->times_debug /1000); + } pos = next; } } diff --git a/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c index a99740842..4f3829bcf 100644 --- a/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c +++ b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c @@ -208,10 +208,12 @@ long be_munmap(void *start, size_t len) assert(info); void *heap_addr = (void *)((umword_t)TASK_RAM_BASE() + info->i.heap_offset - info->i.data_offset); - if (len & (PAGE_SIZE - 1)) - { - return -EINVAL; - } + len = ALIGN(len, MK_PAGE_SIZE); + + // if (len & (PAGE_SIZE - 1)) + // { + // return -EINVAL; + // } // printf("munmap 0x%x, 0x%x.\n", start, len); tag = u_vmam_free(VMA_PROT, (addr_t)(start), len); if (msg_tag_get_val(tag) < 0) diff --git a/mkrtos_user/lib/libc_backend/src/be_exit.c b/mkrtos_user/lib/libc_backend/src/be_exit.c index b1eea0bb2..29b89b97b 100644 --- a/mkrtos_user/lib/libc_backend/src/be_exit.c +++ b/mkrtos_user/lib/libc_backend/src/be_exit.c @@ -65,7 +65,7 @@ void be_exit(long exit_code) while (1) { // thread_ipc_wait(ipc_timeout_create2(0, 0), NULL, -1); - u_sleep_ms((umword_t)-1); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 5319c2131..0ae329b14 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -384,6 +384,9 @@ long be_ioctl(long fd, long req, void *args) ret = fs_ioctl(u_fd.priv_fd, req, args); } break; + default: + ret = -ENOSYS; + break; } return ret; } @@ -519,7 +522,7 @@ long be_poll(struct pollfd *fds, nfds_t n, int timeout) if (timeout == -1) { again1: - ret = ioctl(fds[0].fd, FIONREAD, &len); + ret = be_ioctl(fds[0].fd, FIONREAD, &len); if (ret < 0) { return ret; @@ -534,7 +537,7 @@ long be_poll(struct pollfd *fds, nfds_t n, int timeout) else { again: - ret = ioctl(fds[0].fd, FIONREAD, &len); + ret = be_ioctl(fds[0].fd, FIONREAD, &len); if (ret < 0) { return ret; diff --git a/mkrtos_user/lib/sys/inc/u_arch.h b/mkrtos_user/lib/sys/inc/u_arch.h index 2854b4a21..b619c103b 100644 --- a/mkrtos_user/lib/sys/inc/u_arch.h +++ b/mkrtos_user/lib/sys/inc/u_arch.h @@ -2,8 +2,9 @@ #include "u_types.h" #include "u_arch_hard.h" - +#ifndef PAGE_SIZE #define PAGE_SIZE (1UL << CONFIG_PAGE_SHIFT) +#endif #define MK_PAGE_SIZE (PAGE_SIZE) #define WORD_BYTES (sizeof(void *)) #define WORD_BITS (WORD_BYTES * 8) diff --git a/mkrtos_user/lib/util/inc/u_malloc.h b/mkrtos_user/lib/util/inc/u_malloc.h index 2adfaee24..d30dceb16 100644 --- a/mkrtos_user/lib/util/inc/u_malloc.h +++ b/mkrtos_user/lib/util/inc/u_malloc.h @@ -1,14 +1,23 @@ #pragma once +#include +// struct allocmem +// { +// void *ptr; +// size_t size; +// struct allocmem *next; +// }; -struct allocmem +void *u_malloc(size_t n); +static inline void *u_calloc(size_t size, int nmemb) { - void *ptr; - size_t size; - struct allocmem *next; -}; + void *mem = u_malloc(size * nmemb); -void *u_malloc(size_t size); -void *u_calloc(size_t size, int nmemb); + if (mem) + { + memset(mem, 0, size * nmemb); + } + return mem; +} void *u_realloc(void *old, size_t size); -void u_free(void *ptr); +void u_free(void *p); // void spurge(); diff --git a/mkrtos_user/lib/util/src/aligned_alloc.c b/mkrtos_user/lib/util/src/aligned_alloc.c new file mode 100644 index 000000000..4adca3b4f --- /dev/null +++ b/mkrtos_user/lib/util/src/aligned_alloc.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include "malloc_impl.h" + +void *aligned_alloc(size_t align, size_t len) +{ + unsigned char *mem, *new; + + if ((align & -align) != align) { + errno = EINVAL; + return 0; + } + + if (len > SIZE_MAX - align || + (__malloc_replaced && !__aligned_alloc_replaced)) { + errno = ENOMEM; + return 0; + } + + if (align <= SIZE_ALIGN) + return malloc(len); + + if (!(mem = malloc(len + align-1))) + return 0; + + new = (void *)((uintptr_t)mem + align-1 & -align); + if (new == mem) return mem; + + struct chunk *c = MEM_TO_CHUNK(mem); + struct chunk *n = MEM_TO_CHUNK(new); + + if (IS_MMAPPED(c)) { + /* Apply difference between aligned and original + * address to the "extra" field of mmapped chunk. */ + n->psize = c->psize + (new-mem); + n->csize = c->csize - (new-mem); + return new; + } + + struct chunk *t = NEXT_CHUNK(c); + + /* Split the allocated chunk into two chunks. The aligned part + * that will be used has the size in its footer reduced by the + * difference between the aligned and original addresses, and + * the resulting size copied to its header. A new header and + * footer are written for the split-off part to be freed. */ + n->psize = c->csize = C_INUSE | (new-mem); + n->csize = t->psize -= new-mem; + + __bin_chunk(c); + return new; +} diff --git a/mkrtos_user/lib/util/src/malloc_impl.h b/mkrtos_user/lib/util/src/malloc_impl.h new file mode 100644 index 000000000..f96fabc1f --- /dev/null +++ b/mkrtos_user/lib/util/src/malloc_impl.h @@ -0,0 +1,38 @@ +#ifndef MALLOC_IMPL_H +#define MALLOC_IMPL_H + +#include +#include "dynlink.h" + +struct chunk { + size_t psize, csize; + struct chunk *next, *prev; +}; + +struct bin { + volatile int lock[2]; + struct chunk *head; + struct chunk *tail; +}; + +#define SIZE_ALIGN (4*sizeof(size_t)) +#define SIZE_MASK (-SIZE_ALIGN) +#define OVERHEAD (2*sizeof(size_t)) +#define MMAP_THRESHOLD (0x1c00*SIZE_ALIGN) +#define DONTCARE 16 +#define RECLAIM 163840 + +#define CHUNK_SIZE(c) ((c)->csize & -2) +#define CHUNK_PSIZE(c) ((c)->psize & -2) +#define PREV_CHUNK(c) ((struct chunk *)((char *)(c) - CHUNK_PSIZE(c))) +#define NEXT_CHUNK(c) ((struct chunk *)((char *)(c) + CHUNK_SIZE(c))) +#define MEM_TO_CHUNK(p) (struct chunk *)((char *)(p) - OVERHEAD) +#define CHUNK_TO_MEM(c) (void *)((char *)(c) + OVERHEAD) +#define BIN_TO_CHUNK(i) (MEM_TO_CHUNK(&mal.bins[i].head)) + +#define C_INUSE ((size_t)1) + +#define IS_MMAPPED(c) !((c)->csize & (C_INUSE)) + + +#endif diff --git a/mkrtos_user/lib/util/src/malloc_usable_size.c b/mkrtos_user/lib/util/src/malloc_usable_size.c new file mode 100644 index 000000000..672b518ad --- /dev/null +++ b/mkrtos_user/lib/util/src/malloc_usable_size.c @@ -0,0 +1,9 @@ +#include +#include "malloc_impl.h" + +hidden void *(*const __realloc_dep)(void *, size_t) = realloc; + +size_t malloc_usable_size(void *p) +{ + return p ? CHUNK_SIZE(MEM_TO_CHUNK(p)) - OVERHEAD : 0; +} diff --git a/mkrtos_user/lib/util/src/u_malloc.c b/mkrtos_user/lib/util/src/u_malloc.c index 1bcca1494..05ebd8c61 100644 --- a/mkrtos_user/lib/util/src/u_malloc.c +++ b/mkrtos_user/lib/util/src/u_malloc.c @@ -1,206 +1,558 @@ -/** - * u_malloc.c: a simple memory allocator for use in MKRTOS. - * 使用缺页模拟申请内存,申请的内存不能用于栈内存。 - */ +#define _GNU_SOURCE #include -#include -#include -#include -#include #include - -#include -#include -#include -#include +#include +#include #include +#include +#include "libc.h" +#include "atomic.h" +#include "pthread_impl.h" +#include "malloc_impl.h" +// #include "fork_impl.h" -static struct allocmem *memlocs = NULL; -static u_mutex_t lock_mutex = U_MUTEX_INIT; +void u_free(void *p); +static void __bin_chunk(struct chunk *self); +// #define malloc __libc_malloc_impl +// #define realloc __libc_realloc +// #define free __libc_free -static void alloc_lock(void) +#if defined(__GNUC__) && defined(__PIC__) +#define inline inline __attribute__((always_inline)) +#endif + +static struct { + volatile uint64_t binmap; + struct bin bins[64]; + volatile int split_merge_lock[2]; +} mal; + +/* Synchronization tools */ + +static inline void lock(volatile int *lk) { - obj_handler_t lock_hd; - - if (lock_mutex.obj == HANDLER_INVALID) - { - lock_hd = handler_alloc(); - assert(lock_hd != HANDLER_INVALID); - u_mutex_init(&lock_mutex, lock_hd); - } - u_mutex_lock(&lock_mutex, 0, NULL); -} -static void alloc_unlock(void) -{ - assert(lock_mutex.obj != HANDLER_INVALID); - u_mutex_unlock(&lock_mutex); + int need_locks = libc.need_locks; + if (need_locks) { + while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1); + if (need_locks < 0) libc.need_locks = 0; + } } -static struct allocmem *new_alloc_mem() +static inline void unlock(volatile int *lk) { - struct allocmem *ptr; - if ((ptr = mmap(NULL, sizeof(struct allocmem), PROT_READ | PROT_WRITE | PROT_PFS, MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) == MAP_FAILED) - { - return NULL; - } - else - { - ptr->ptr = NULL; - ptr->size = 0; - ptr->next = NULL; - return ptr; - } + if (lk[0]) { + a_store(lk, 0); + if (lk[1]) __wake(lk, 1, 1); + } } -static void free_alloc_mem(struct allocmem *ptr) +static inline void lock_bin(int i) { - if (ptr != NULL) - { - munmap(ptr, sizeof(struct allocmem)); - } + lock(mal.bins[i].lock); + if (!mal.bins[i].head) + mal.bins[i].head = mal.bins[i].tail = BIN_TO_CHUNK(i); } -/// Pass a valid pointer (or NULL) to store the resultant into -struct allocmem *insert_end(struct allocmem *ptr, struct allocmem **outVar) +static inline void unlock_bin(int i) { - if (ptr == NULL) - { - struct allocmem *outAble = new_alloc_mem(); - if (outVar != NULL) - *outVar = outAble; - return (outAble); - } - else - { - ptr->next = insert_end(ptr->next, outVar); - return ptr; - } + unlock(mal.bins[i].lock); } -struct allocmem *find(struct allocmem *ptr, void *searchPtr) +static int first_set(uint64_t x) { - if (ptr == NULL) - { - return NULL; - } - if (ptr->ptr == searchPtr) - return ptr; - return find(ptr->next, searchPtr); +#if 1 + return a_ctz_64(x); +#else + static const char debruijn64[64] = { + 0, 1, 2, 53, 3, 7, 54, 27, 4, 38, 41, 8, 34, 55, 48, 28, + 62, 5, 39, 46, 44, 42, 22, 9, 24, 35, 59, 56, 49, 18, 29, 11, + 63, 52, 6, 26, 37, 40, 33, 47, 61, 45, 43, 21, 23, 58, 17, 10, + 51, 25, 36, 32, 60, 20, 57, 16, 50, 31, 19, 15, 30, 14, 13, 12 + }; + static const char debruijn32[32] = { + 0, 1, 23, 2, 29, 24, 19, 3, 30, 27, 25, 11, 20, 8, 4, 13, + 31, 22, 28, 18, 26, 10, 7, 12, 21, 17, 9, 6, 16, 5, 15, 14 + }; + if (sizeof(long) < 8) { + uint32_t y = x; + if (!y) { + y = x>>32; + return 32 + debruijn32[(y&-y)*0x076be629 >> 27]; + } + return debruijn32[(y&-y)*0x076be629 >> 27]; + } + return debruijn64[(x&-x)*0x022fdd63cc95386dull >> 58]; +#endif } -struct allocmem *find_and_remove(struct allocmem *ptr, void *searchPtr) +static const unsigned char bin_tab[60] = { + 32,33,34,35,36,36,37,37,38,38,39,39, + 40,40,40,40,41,41,41,41,42,42,42,42,43,43,43,43, + 44,44,44,44,44,44,44,44,45,45,45,45,45,45,45,45, + 46,46,46,46,46,46,46,46,47,47,47,47,47,47,47,47, +}; + +static int bin_index(size_t x) { - if (ptr == NULL) - { - return NULL; - } - if (ptr->ptr == searchPtr) - { - struct allocmem *nextUp = ptr->next; - free_alloc_mem(ptr); - return nextUp; - } - ptr->next = find_and_remove(ptr->next, searchPtr); - return ptr; + x = x / SIZE_ALIGN - 1; + if (x <= 32) return x; + if (x < 512) return bin_tab[x/8-4]; + if (x > 0x1c00) return 63; + return bin_tab[x/128-4] + 16; } -void *u_malloc(size_t size) +static int bin_index_up(size_t x) { - struct allocmem *info = NULL; - - alloc_lock(); - memlocs = insert_end(memlocs, &info); - if (info == NULL) - { - /// Failed to initialize metadata info - alloc_unlock(); - return NULL; - } - void *ptr; - if ((ptr = mmap(NULL, size, PROT_READ | PROT_WRITE | PROT_PFS, MAP_POPULATE | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0)) == MAP_FAILED) - { - /// Failed to make data, revert changes - memlocs = find_and_remove(memlocs, NULL); - } - else - { - /// Got it together - info->ptr = ptr; - info->size = size; - /// Return this precious pointer - alloc_unlock(); - return ptr; - } - alloc_unlock(); - return NULL; + x = x / SIZE_ALIGN - 1; + if (x <= 32) return x; + x--; + if (x < 512) return bin_tab[x/8-4] + 1; + return bin_tab[x/128-4] + 17; } -void *u_calloc(size_t size, int nmemb) +#if 0 +void __dump_heap(int x) { - size_t isOverFlow = size * nmemb; - if (size != isOverFlow / nmemb) - { - /// Overflow, dont try - return NULL; - } - void *newPtr = u_malloc(isOverFlow); - if (newPtr == NULL) - { - /// Failed to init - return NULL; - } - /// A character is a byte of data that can be managed - for (size_t loc = 0; loc < isOverFlow; loc++) - { - *(((char *)newPtr) + loc) = 0; - } - return newPtr; + struct chunk *c; + int i; + for (c = (void *)mal.heap; CHUNK_SIZE(c); c = NEXT_CHUNK(c)) + fprintf(stderr, "base %p size %zu (%d) flags %d/%d\n", + c, CHUNK_SIZE(c), bin_index(CHUNK_SIZE(c)), + c->csize & 15, + NEXT_CHUNK(c)->psize & 15); + for (i=0; i<64; i++) { + if (mal.bins[i].head != BIN_TO_CHUNK(i) && mal.bins[i].head) { + fprintf(stderr, "bin %d: %p\n", i, mal.bins[i].head); + if (!(mal.binmap & 1ULL<size; - alloc_unlock(); - memcpy(new_mem, old, old_size); - u_free(old); - return new_mem; -} -void u_free(void *ptr) +/* This function returns true if the interval [old,new] + * intersects the 'len'-sized interval below &libc.auxv + * (interpreted as the main-thread stack) or below &b + * (the current stack). It is used to defend against + * buggy brk implementations that can cross the stack. */ + +static int traverses_stack_p(uintptr_t old, uintptr_t new) { - if (ptr == NULL) - return; - alloc_lock(); - struct allocmem *info = find(memlocs, ptr); - if (info == NULL) - { - alloc_unlock(); - return; - } - munmap(info->ptr, info->size); - memlocs = find_and_remove(memlocs, ptr); - alloc_unlock(); + const uintptr_t len = 8<<20; + uintptr_t a, b; + + b = (uintptr_t)libc.auxv; + a = b > len ? b-len : 0; + if (new>a && old len ? b-len : 0; + if (new>a && oldptr); -// } -// } \ No newline at end of file +/* Expand the heap in-place if brk can be used, or otherwise via mmap, + * using an exponential lower bound on growth by mmap to make + * fragmentation asymptotically irrelevant. The size argument is both + * an input and an output, since the caller needs to know the size + * allocated, which will be larger than requested due to page alignment + * and mmap minimum size rules. The caller is responsible for locking + * to prevent concurrent calls. */ + +static void *__expand_heap(size_t *pn) +{ + static uintptr_t brk; + static unsigned mmap_step; + size_t n = *pn; + + if (n > SIZE_MAX/2 - PAGE_SIZE) { + errno = ENOMEM; + return 0; + } + n += -n & PAGE_SIZE-1; + + if (!brk) { + brk = __syscall(SYS_brk, 0); + brk += -brk & PAGE_SIZE-1; + } + + if (n < SIZE_MAX-brk && !traverses_stack_p(brk, brk+n) + && __syscall(SYS_brk, brk+n)==brk+n) { + *pn = n; + brk += n; + return (void *)(brk-n); + } + + size_t min = (size_t)PAGE_SIZE << mmap_step/2; + if (n < min) n = min; + void *area = __mmap(0, n, PROT_READ|PROT_WRITE|PROT_PFS, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (area == MAP_FAILED) return 0; + *pn = n; + mmap_step++; + return area; +} + +static struct chunk *expand_heap(size_t n) +{ + static void *end; + void *p; + struct chunk *w; + + /* The argument n already accounts for the caller's chunk + * overhead needs, but if the heap can't be extended in-place, + * we need room for an extra zero-sized sentinel chunk. */ + n += SIZE_ALIGN; + + p = __expand_heap(&n); + if (!p) return 0; + + /* If not just expanding existing space, we need to make a + * new sentinel chunk below the allocated space. */ + if (p != end) { + /* Valid/safe because of the prologue increment. */ + n -= SIZE_ALIGN; + p = (char *)p + SIZE_ALIGN; + w = MEM_TO_CHUNK(p); + w->psize = 0 | C_INUSE; + } + + /* Record new heap end and fill in footer. */ + end = (char *)p + n; + w = MEM_TO_CHUNK(end); + w->psize = n | C_INUSE; + w->csize = 0 | C_INUSE; + + /* Fill in header, which may be new or may be replacing a + * zero-size sentinel header at the old end-of-heap. */ + w = MEM_TO_CHUNK(p); + w->csize = n | C_INUSE; + + return w; +} + +static int adjust_size(size_t *n) +{ + /* Result of pointer difference must fit in ptrdiff_t. */ + if (*n-1 > PTRDIFF_MAX - SIZE_ALIGN - PAGE_SIZE) { + if (*n) { + errno = ENOMEM; + return -1; + } else { + *n = SIZE_ALIGN; + return 0; + } + } + *n = (*n + OVERHEAD + SIZE_ALIGN - 1) & SIZE_MASK; + return 0; +} + +static void unbin(struct chunk *c, int i) +{ + if (c->prev == c->next) + a_and_64(&mal.binmap, ~(1ULL<prev->next = c->next; + c->next->prev = c->prev; + c->csize |= C_INUSE; + NEXT_CHUNK(c)->psize |= C_INUSE; +} + +static void bin_chunk(struct chunk *self, int i) +{ + self->next = BIN_TO_CHUNK(i); + self->prev = mal.bins[i].tail; + self->next->prev = self; + self->prev->next = self; + if (self->prev == BIN_TO_CHUNK(i)) + a_or_64(&mal.binmap, 1ULL<= n1 - DONTCARE) return; + + next = NEXT_CHUNK(self); + split = (void *)((char *)self + n); + + split->psize = n | C_INUSE; + split->csize = n1-n; + next->psize = n1-n; + self->csize = n | C_INUSE; + + int i = bin_index(n1-n); + lock_bin(i); + + bin_chunk(split, i); + + unlock_bin(i); +} + +void *u_malloc(size_t n) +{ + struct chunk *c; + int i, j; + uint64_t mask; + + if (adjust_size(&n) < 0) return 0; + + if (n > MMAP_THRESHOLD) { + size_t len = n + OVERHEAD + PAGE_SIZE - 1 & -PAGE_SIZE; + char *base = __mmap(0, len, PROT_READ|PROT_WRITE | PROT_PFS, + MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + if (base == (void *)-1) return 0; + c = (void *)(base + SIZE_ALIGN - OVERHEAD); + c->csize = len - (SIZE_ALIGN - OVERHEAD); + c->psize = SIZE_ALIGN - OVERHEAD; + return CHUNK_TO_MEM(c); + } + + i = bin_index_up(n); + if (i<63 && (mal.binmap & (1ULL<psize; + char *base = (char *)self - extra; + size_t oldlen = n0 + extra; + size_t newlen = n + extra; + /* Crash on realloc of freed chunk */ + if (extra & 1) a_crash(); + if (newlen < PAGE_SIZE && (new = malloc(n-OVERHEAD))) { + n0 = n; + goto copy_free_ret; + } + newlen = (newlen + PAGE_SIZE-1) & -PAGE_SIZE; + if (oldlen == newlen) return p; + base = __mremap(base, oldlen, newlen, MREMAP_MAYMOVE); + if (base == (void *)-1) + goto copy_realloc; + self = (void *)(base + extra); + self->csize = newlen - extra; + return CHUNK_TO_MEM(self); + } + + next = NEXT_CHUNK(self); + + /* Crash on corrupted footer (likely from buffer overflow) */ + if (next->psize != self->csize) a_crash(); + + if (n < n0) { + int i = bin_index_up(n); + int j = bin_index(n0); + if (icsize = split->psize = n | C_INUSE; + split->csize = next->psize = n0-n | C_INUSE; + __bin_chunk(split); + return CHUNK_TO_MEM(self); + } + + lock(mal.split_merge_lock); + + size_t nsize = next->csize & C_INUSE ? 0 : CHUNK_SIZE(next); + if (n0+nsize >= n) { + int i = bin_index(nsize); + lock_bin(i); + if (!(next->csize & C_INUSE)) { + unbin(next, i); + unlock_bin(i); + next = NEXT_CHUNK(next); + self->csize = next->psize = n0+nsize | C_INUSE; + trim(self, n); + unlock(mal.split_merge_lock); + return CHUNK_TO_MEM(self); + } + unlock_bin(i); + } + unlock(mal.split_merge_lock); + +copy_realloc: + /* As a last resort, allocate a new chunk and copy to it. */ + new = malloc(n-OVERHEAD); + if (!new) return 0; +copy_free_ret: + memcpy(new, p, (npsize != self->csize) a_crash(); + + lock(mal.split_merge_lock); + + size_t osize = CHUNK_SIZE(self), size = osize; + + /* Since we hold split_merge_lock, only transition from free to + * in-use can race; in-use to free is impossible */ + size_t psize = self->psize & C_INUSE ? 0 : CHUNK_PSIZE(self); + size_t nsize = next->csize & C_INUSE ? 0 : CHUNK_SIZE(next); + + if (psize) { + int i = bin_index(psize); + lock_bin(i); + if (!(self->psize & C_INUSE)) { + struct chunk *prev = PREV_CHUNK(self); + unbin(prev, i); + self = prev; + size += psize; + } + unlock_bin(i); + } + if (nsize) { + int i = bin_index(nsize); + lock_bin(i); + if (!(next->csize & C_INUSE)) { + unbin(next, i); + next = NEXT_CHUNK(next); + size += nsize; + } + unlock_bin(i); + } + + int i = bin_index(size); + lock_bin(i); + + self->csize = size; + next->psize = size; + bin_chunk(self, i); + unlock(mal.split_merge_lock); + + /* Replace middle of large chunks with fresh zero pages */ + if (size > RECLAIM && (size^(size-osize)) > size-osize) { + uintptr_t a = (uintptr_t)self + SIZE_ALIGN+PAGE_SIZE-1 & -PAGE_SIZE; + uintptr_t b = (uintptr_t)next - SIZE_ALIGN & -PAGE_SIZE; + int e = errno; +#if 1 + __madvise((void *)a, b-a, MADV_DONTNEED); +#else + __mmap((void *)a, b-a, PROT_READ|PROT_WRITE | PROT_PFS, + MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0); +#endif + errno = e; + } + + unlock_bin(i); +} + +static void unmap_chunk(struct chunk *self) +{ + size_t extra = self->psize; + char *base = (char *)self - extra; + size_t len = CHUNK_SIZE(self) + extra; + /* Crash on double free */ + if (extra & 1) a_crash(); + int e = errno; + __munmap(base, len); + errno = e; +} + +void u_free(void *p) +{ + if (!p) return; + + struct chunk *self = MEM_TO_CHUNK(p); + + if (IS_MMAPPED(self)) + unmap_chunk(self); + else + __bin_chunk(self); +} +#if 0 +static void __malloc_donate(char *start, char *end) +{ + size_t align_start_up = (SIZE_ALIGN-1) & (-(uintptr_t)start - OVERHEAD); + size_t align_end_down = (SIZE_ALIGN-1) & (uintptr_t)end; + + /* Getting past this condition ensures that the padding for alignment + * and header overhead will not overflow and will leave a nonzero + * multiple of SIZE_ALIGN bytes between start and end. */ + if (end - start <= OVERHEAD + align_start_up + align_end_down) + return; + start += align_start_up + OVERHEAD; + end -= align_end_down; + + struct chunk *c = MEM_TO_CHUNK(start), *n = MEM_TO_CHUNK(end); + c->psize = n->csize = C_INUSE; + c->csize = n->psize = C_INUSE | (end-start); + __bin_chunk(c); +} +void __malloc_atfork(int who) +{ + if (who<0) { + lock(mal.split_merge_lock); + for (int i=0; i<64; i++) + lock(mal.bins[i].lock); + } else if (!who) { + for (int i=0; i<64; i++) + unlock(mal.bins[i].lock); + unlock(mal.split_merge_lock); + } else { + for (int i=0; i<64; i++) + mal.bins[i].lock[0] = mal.bins[i].lock[1] = 0; + mal.split_merge_lock[1] = 0; + mal.split_merge_lock[0] = 0; + } +} +#endif diff --git a/mkrtos_user/server/fs/appfs/main.c b/mkrtos_user/server/fs/appfs/main.c index 16a0e80a0..a93f7ec02 100644 --- a/mkrtos_user/server/fs/appfs/main.c +++ b/mkrtos_user/server/fs/appfs/main.c @@ -87,7 +87,7 @@ int main(int argc, char *argv[]) #endif while (1) { - u_sleep_ms((umword_t)(-1)); + u_sleep_ms(U_SLEEP_ALWAYS); } return 0; } \ No newline at end of file diff --git a/mkrtos_user/server/init/src/init.c b/mkrtos_user/server/init/src/init.c index 31c451860..11aa68895 100644 --- a/mkrtos_user/server/init/src/init.c +++ b/mkrtos_user/server/init/src/init.c @@ -80,7 +80,7 @@ int main(int argc, char *args[]) // task_unmap(TASK_THIS, vpage_create_raw3(KOBJ_DELETE_RIGHT, 0, THREAD_MAIN)); while (1) { - u_sleep_ms((umword_t)(-1)); + u_sleep_ms(U_SLEEP_ALWAYS); } return 0; } diff --git a/mkrtos_user/server/init/src/tty.c b/mkrtos_user/server/init/src/tty.c index 709bc196d..5f95de525 100644 --- a/mkrtos_user/server/init/src/tty.c +++ b/mkrtos_user/server/init/src/tty.c @@ -98,7 +98,7 @@ static void console_read_func(void) // handler_free_umap(cons_obj.hd_cons_read); while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/server/net/src/main.c b/mkrtos_user/server/net/src/main.c index 5071a3f5b..e327b00a1 100644 --- a/mkrtos_user/server/net/src/main.c +++ b/mkrtos_user/server/net/src/main.c @@ -135,7 +135,7 @@ again: } else { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } return 0; diff --git a/mkrtos_user/user/app/vi/heap_stack.c b/mkrtos_user/user/app/vi/heap_stack.c index ee11e4108..dab72bb41 100644 --- a/mkrtos_user/user/app/vi/heap_stack.c +++ b/mkrtos_user/user/app/vi/heap_stack.c @@ -1,6 +1,6 @@ #define HEAP_SIZE (512) -#define STACK_SIZE (1024 * 2) +#define STACK_SIZE (1024 * 3) #if defined(__CC_ARM) #define HEAP_ATTR SECTION("HEAP") __attribute__((zero_init)) diff --git a/mkrtos_user/user/app/vi/vi-master/vi_utils.h b/mkrtos_user/user/app/vi/vi-master/vi_utils.h index adc8e5499..b56fdebd1 100644 --- a/mkrtos_user/user/app/vi/vi-master/vi_utils.h +++ b/mkrtos_user/user/app/vi/vi-master/vi_utils.h @@ -21,7 +21,6 @@ #include #include #include - #define BB_VER "latest: 2021-04-07" #define BB_BT "busybox vi" diff --git a/mkrtos_user/user/drv/ATSURFF437/eth/main.c b/mkrtos_user/user/drv/ATSURFF437/eth/main.c index ed9da61cc..1d7a29eb1 100644 --- a/mkrtos_user/user/drv/ATSURFF437/eth/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/eth/main.c @@ -102,6 +102,6 @@ int main(int argc, char *argv[]) meta_reg_svr_obj(&net_drv.svr, BLK_DRV_PROT); while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/user/drv/ATSURFF437/i2c/main.c b/mkrtos_user/user/drv/ATSURFF437/i2c/main.c index 361ab9a5a..73f1d4d05 100644 --- a/mkrtos_user/user/drv/ATSURFF437/i2c/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/i2c/main.c @@ -49,6 +49,6 @@ int main(int argc, char *argv[]) ns_register("/i2c2", hd, 0); while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/user/drv/ATSURFF437/pca9555/main.c b/mkrtos_user/user/drv/ATSURFF437/pca9555/main.c index 4130757f8..b6ec896dd 100644 --- a/mkrtos_user/user/drv/ATSURFF437/pca9555/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/pca9555/main.c @@ -49,6 +49,6 @@ int main(int argc, char *argv[]) ns_register("/pca9555", hd, 0); while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/user/drv/ATSURFF437/snd/main.c b/mkrtos_user/user/drv/ATSURFF437/snd/main.c index 2ebbcde8d..272b2b586 100644 --- a/mkrtos_user/user/drv/ATSURFF437/snd/main.c +++ b/mkrtos_user/user/drv/ATSURFF437/snd/main.c @@ -93,6 +93,6 @@ int main(int argc, char *argv[]) meta_reg_svr_obj(&snd_drv.svr, BLK_DRV_PROT); while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/user/drv/STM32F205/block/main.c b/mkrtos_user/user/drv/STM32F205/block/main.c index 8bf00b5c0..70eb3d73c 100644 --- a/mkrtos_user/user/drv/STM32F205/block/main.c +++ b/mkrtos_user/user/drv/STM32F205/block/main.c @@ -128,6 +128,6 @@ int main(int argc, char *argv[]) while (1) { // rpc_loop(); - u_sleep_ms((umword_t)(-1)); + u_sleep_ms(U_SLEEP_ALWAYS); } } diff --git a/mkrtos_user/user/drv/common/ram_block/main.c b/mkrtos_user/user/drv/common/ram_block/main.c index 1e24625e6..a9e61c5f9 100644 --- a/mkrtos_user/user/drv/common/ram_block/main.c +++ b/mkrtos_user/user/drv/common/ram_block/main.c @@ -159,6 +159,6 @@ int main(int argc, char *argv[]) while (1) { - u_sleep_ms(0); + u_sleep_ms(U_SLEEP_ALWAYS); } }