mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
use asm in stdtask run_once
This commit is contained in:
parent
2c98aa6710
commit
a5896fc40b
@ -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) {
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user