use asm in stdtask run_once

This commit is contained in:
lyon 2022-01-24 20:03:44 +08:00
parent 2c98aa6710
commit a5896fc40b
3 changed files with 378 additions and 23 deletions

View File

@ -42,6 +42,7 @@ void PikaStdTask_Task_call_period_ms(PikaObj* self,
void PikaStdTask_Task_run_once(PikaObj* self) {
/* transfer the tick to pikaMain */
obj_setInt(__pikaMain, "__tick", obj_getInt(self, "tick"));
/* Python
obj_run(__pikaMain,
"len = __calls.len()\n"
"mode = 'none'\n"
@ -79,17 +80,177 @@ void PikaStdTask_Task_run_once(PikaObj* self) {
" __calls[i] = __tick + period_ms\n"
" info_index = 0\n"
"\n");
/* Python
__len = __calls_period.len()
for i in range(0, __len):
if __len == 0:
break
time = __time_period[i]
if __tick > __time_period[i]:
todo = __calls_period[i]
todo()
__time_period[i] = __tick + __assert_period[i]
*/
pikaVM_runAsm(__pikaMain,
"B0\n"
"0 RUN __calls.len\n"
"0 OUT len\n"
"B0\n"
"0 STR none\n"
"0 OUT mode\n"
"B0\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B0\n"
"2 NUM 0\n"
"2 REF len\n"
"1 RUN range\n"
"0 RUN iter\n"
"0 OUT _l0\n"
"0 REF _r1\n"
"0 REF _r2\n"
"0 REF _r3\n"
"0 OUT _l0.a1\n"
"0 OUT _l0.a2\n"
"0 OUT _l0.a3\n"
"B0\n"
"0 RUN _l0.__next__\n"
"0 OUT i\n"
"0 EST i\n"
"0 JEZ 2\n"
"B1\n"
"1 REF len\n"
"1 NUM 0\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"0 BRK\n"
"B1\n"
"1 REF info_index\n"
"1 NUM 0\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT mode\n"
"B2\n"
"0 NUM 1\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 1\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR always\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B3\n"
"0 RUN todo\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR when\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT when\n"
"B3\n"
"0 NUM 2\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT period_ms\n"
"B3\n"
"0 NUM 2\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 2\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR when\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"0 RUN when\n"
"0 JEZ 1\n"
"B4\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B4\n"
"0 RUN todo\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B3\n"
"0 NUM 3\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 3\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __tick\n"
"2 REF __calls\n"
"2 REF i\n"
"1 RUN __get__\n"
"0 OPT >\n"
"0 JEZ 1\n"
"B4\n"
"0 RUN todo\n"
"B4\n"
"1 REF __calls\n"
"1 REF i\n"
"2 REF __tick\n"
"2 REF period_ms\n"
"1 OPT +\n"
"1 STR __calls\n"
"0 RUN __set__\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B0\n"
"0 JMP -1\n"
"B0\n"
"0 DEL _l0\n"
"B0\n");
}
void __Task_update_tick(PikaObj* self) {

View File

@ -42,6 +42,7 @@ void PikaStdTask_Task_call_period_ms(PikaObj* self,
void PikaStdTask_Task_run_once(PikaObj* self) {
/* transfer the tick to pikaMain */
obj_setInt(__pikaMain, "__tick", obj_getInt(self, "tick"));
/* Python
obj_run(__pikaMain,
"len = __calls.len()\n"
"mode = 'none'\n"
@ -79,17 +80,177 @@ void PikaStdTask_Task_run_once(PikaObj* self) {
" __calls[i] = __tick + period_ms\n"
" info_index = 0\n"
"\n");
/* Python
__len = __calls_period.len()
for i in range(0, __len):
if __len == 0:
break
time = __time_period[i]
if __tick > __time_period[i]:
todo = __calls_period[i]
todo()
__time_period[i] = __tick + __assert_period[i]
*/
pikaVM_runAsm(__pikaMain,
"B0\n"
"0 RUN __calls.len\n"
"0 OUT len\n"
"B0\n"
"0 STR none\n"
"0 OUT mode\n"
"B0\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B0\n"
"2 NUM 0\n"
"2 REF len\n"
"1 RUN range\n"
"0 RUN iter\n"
"0 OUT _l0\n"
"0 REF _r1\n"
"0 REF _r2\n"
"0 REF _r3\n"
"0 OUT _l0.a1\n"
"0 OUT _l0.a2\n"
"0 OUT _l0.a3\n"
"B0\n"
"0 RUN _l0.__next__\n"
"0 OUT i\n"
"0 EST i\n"
"0 JEZ 2\n"
"B1\n"
"1 REF len\n"
"1 NUM 0\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"0 BRK\n"
"B1\n"
"1 REF info_index\n"
"1 NUM 0\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT mode\n"
"B2\n"
"0 NUM 1\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 1\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR always\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B3\n"
"0 RUN todo\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR when\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT when\n"
"B3\n"
"0 NUM 2\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT period_ms\n"
"B3\n"
"0 NUM 2\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 2\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR when\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"0 RUN when\n"
"0 JEZ 1\n"
"B4\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B4\n"
"0 RUN todo\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B2\n"
"0 NEL 1\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __calls\n"
"1 REF i\n"
"0 RUN __get__\n"
"0 OUT todo\n"
"B3\n"
"0 NUM 3\n"
"0 OUT info_index\n"
"B1\n"
"0 NEL 1\n"
"1 REF info_index\n"
"1 NUM 3\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B2\n"
"1 REF mode\n"
"1 STR period_ms\n"
"0 OPT ==\n"
"0 JEZ 1\n"
"B3\n"
"1 REF __tick\n"
"2 REF __calls\n"
"2 REF i\n"
"1 RUN __get__\n"
"0 OPT >\n"
"0 JEZ 1\n"
"B4\n"
"0 RUN todo\n"
"B4\n"
"1 REF __calls\n"
"1 REF i\n"
"2 REF __tick\n"
"2 REF period_ms\n"
"1 OPT +\n"
"1 STR __calls\n"
"0 RUN __set__\n"
"B3\n"
"0 NUM 0\n"
"0 OUT info_index\n"
"B0\n"
"0 JMP -1\n"
"B0\n"
"0 DEL _l0\n"
"B0\n");
}
void __Task_update_tick(PikaObj* self) {

View File

@ -1884,9 +1884,42 @@ TEST(parser, test__) {
pikaMemInfo.heapUsedMax = 0;
Args* buffs = New_strBuff();
char* lines = (char*)
"if calls_period.len() > 0:\n"
" platformGetTick()\n"
"\n";
"len = __calls.len()\n"
"mode = 'none'\n"
"info_index = 0\n"
"for i in range(0, len):\n"
" if len == 0:\n"
" break\n"
" if info_index == 0:\n"
" mode = __calls[i]\n"
" info_index = 1\n"
" elif info_index == 1:\n"
" if mode == 'always':\n"
" todo = __calls[i]\n"
" todo()\n"
" info_index = 0\n"
" elif mode == 'when':\n"
" when = __calls[i]\n"
" info_index = 2\n"
" elif mode == 'period_ms':\n"
" period_ms = __calls[i]\n"
" info_index = 2\n"
" elif info_index == 2:\n"
" if mode == 'when':\n"
" if when():\n"
" todo = __calls[i]\n"
" todo()\n"
" info_index = 0\n"
" elif mode == 'period_ms':\n"
" todo = __calls[i]\n"
" info_index = 3\n"
" elif info_index == 3:\n"
" if mode == 'period_ms':\n"
" if __tick > __calls[i]:\n"
" todo()\n"
" __calls[i] = __tick + period_ms\n"
" info_index = 0\n"
"\n";
printf("%s", lines);
char* pikaAsm = Parser_multiLineToAsm(buffs, (char*)lines);
printf("%s", pikaAsm);