Browse Source

add task support for STM32G0, add period Task in StdTask

lyon 4 years ago
parent
commit
f33093ee0d

+ 11 - 0
package/PikaStdTask/PikaStdTask.py

@@ -1,10 +1,15 @@
 from PikaObj import *
 import PikaStdData
 
+
 class Task(TinyObj):
     calls_always = PikaStdData.List()
     calls_when = PikaStdData.List()
     assert_when = PikaStdData.List()
+    calls_period = PikaStdData.List()
+    assert_period = PikaStdData.List()
+    time_period = PikaStdData.List()
+
     def __init__():
         pass
 
@@ -14,8 +19,14 @@ class Task(TinyObj):
     def call_when(fun_todo: any, fun_when: any):
         pass
 
+    def call_period_ms(fun_todo: any, period_ms: int):
+        pass
+
     def run_once():
         pass
 
     def run_always():
         pass
+
+    def platformGetTick():
+        pass

+ 174 - 17
package/PikaStdTask/PikaStdTask_Task.c

@@ -5,11 +5,20 @@
 extern PikaObj* __pikaMain;
 void PikaStdTask_Task___init__(PikaObj* self) {
     pikaVM_runAsm(self,
-                  "B0\n0 RUN calls_always.__init__\n0 RUN "
-                  "calls_when.__init__\n0 RUN assert_when.__init__\n");
+                  "B0\n"
+                  "0 RUN calls_always.__init__\n"
+                  "0 RUN calls_when.__init__\n"
+                  "0 RUN assert_when.__init__\n"
+                  "0 RUN calls_period.__init__\n"
+                  "0 RUN assert_period.__init__\n"
+                  "0 RUN time_period.__init__\n");
     obj_setPtr(__pikaMain, "__calls_always", obj_getPtr(self, "calls_always"));
     obj_setPtr(__pikaMain, "__calls_when", obj_getPtr(self, "calls_when"));
     obj_setPtr(__pikaMain, "__assert_when", obj_getPtr(self, "assert_when"));
+    obj_setPtr(__pikaMain, "__calls_period", obj_getPtr(self, "calls_period"));
+    obj_setPtr(__pikaMain, "__assert_period",
+               obj_getPtr(self, "assert_period"));
+    obj_setPtr(__pikaMain, "__time_period", obj_getPtr(self, "time_period"));
 }
 
 void PikaStdTask_Task_call_always(PikaObj* self, Arg* fun_todo) {
@@ -21,24 +30,167 @@ void PikaStdTask_Task_call_when(PikaObj* self, Arg* fun_todo, Arg* fun_when) {
     obj_setArg(self, "fun_todo", fun_todo);
     obj_setArg(self, "fun_when", fun_when);
     pikaVM_runAsm(self,
-                  "B0\n1 REF fun_todo\n0 RUN calls_when.append\nB0\n1 REF "
-                  "fun_when\n0 RUN assert_when.append\n");
+                  "B0\n"
+                  "1 REF fun_todo\n"
+                  "0 RUN calls_when.append\n"
+                  "B0\n"
+                  "1 REF fun_when\n"
+                  "0 RUN assert_when.append\n");
+}
+
+void PikaStdTask_Task_call_period_ms(PikaObj* self,
+                                     Arg* fun_todo,
+                                     int period_ms) {
+    obj_setArg(self, "fun_todo", fun_todo);
+    obj_setInt(self, "period_ms", period_ms);
+    pikaVM_runAsm(self,
+                  "B0\n"
+                  "1 REF fun_todo\n"
+                  "0 RUN calls_period.append\n"
+                  "B0\n"
+                  "1 REF period_ms\n"
+                  "0 RUN assert_period.append\n"
+                  "B0\n"
+                  "1 REF 0\n"
+                  "0 RUN time_period.append\n");
 }
 
 void PikaStdTask_Task_run_once(PikaObj* self) {
-    /* reference the calls_always in __pikaMain */
-    pikaVM_runAsm(
-        __pikaMain,
-        "B0\n1 REF __calls_always\n0 RUN iter\n0 OUT _l0\nB0\n0 RUN "
-        "_l0.__next__\n0 OUT fun_todo\n0 EST fun_todo\n0 JEZ 2\nB1\n0 RUN "
-        "fun_todo\nB0\n0 JMP -1\nB0\n0 DEL _l0\nB0\n0 RUN __calls_when.len\n0 "
-        "OUT len\nB0\n2 NUM 0\n2 REF len\n1 RUN range\n0 RUN iter\n0 OUT "
-        "_l0\n0 REF _r1\n0 REF _r2\n0 REF _r3\n0 OUT _l0.a1\n0 OUT _l0.a2\n0 "
-        "OUT _l0.a3\nB0\n0 RUN _l0.__next__\n0 OUT i\n0 EST i\n0 JEZ 2\nB1\n1 "
-        "REF len\n1 NUM 0\n0 OPT ==\n0 JEZ 1\nB2\n0 BRK\nB1\n1 REF "
-        "__assert_when\n1 REF i\n0 RUN __get__\n0 OUT when\nB1\n0 RUN when\n0 "
-        "JEZ 1\nB2\n1 REF __calls_when\n1 REF i\n0 RUN __get__\n0 OUT "
-        "todo\nB2\n0 RUN todo\nB0\n0 JMP -1\nB0\n0 DEL _l0\nB0\n");
+    obj_run(self, "platformGetTick()");
+    /* transfer the tick to pikaMain */
+    obj_setInt(__pikaMain, "__tick", obj_getInt(self, "tick"));
+    /* 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_period.len\n"
+                  "0 OUT __len\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 __time_period\n"
+                  "1 REF i\n"
+                  "0 RUN __get__\n"
+                  "0 OUT time\n"
+                  "B1\n"
+                  "1 REF __tick\n"
+                  "2 REF __time_period\n"
+                  "2 REF i\n"
+                  "1 RUN __get__\n"
+                  "0 OPT >\n"
+                  "0 JEZ 1\n"
+                  "B2\n"
+                  "1 REF __calls_period\n"
+                  "1 REF i\n"
+                  "0 RUN __get__\n"
+                  "0 OUT todo\n"
+                  "B2\n"
+                  "0 RUN todo\n"
+                  "B2\n"
+                  "1 REF __time_period\n"
+                  "1 REF i\n"
+                  "2 REF __tick\n"
+                  "3 REF __assert_period\n"
+                  "3 REF i\n"
+                  "2 RUN __get__\n"
+                  "1 OPT +\n"
+                  "1 STR __time_period\n"
+                  "0 RUN __set__\n"
+                  "B0\n"
+                  "0 JMP -1\n"
+                  "B0\n"
+                  "0 DEL _l0\n"
+                  "B0 \n");
+
+    /* Python
+    __len = __calls_when.len()
+    for i in range(0, __len):
+        if __len == 0:
+            break
+        when = __assert_when[i]
+        if when():
+            todo = __calls_when[i]
+            todo()
+    */
+    pikaVM_runAsm(__pikaMain,
+                  "B0\n"
+                  "0 RUN __calls_when.len\n"
+                  "0 OUT __len\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 __assert_when\n"
+                  "1 REF i\n"
+                  "0 RUN __get__\n"
+                  "0 OUT when\n"
+                  "B1\n"
+                  "0 RUN when\n"
+                  "0 JEZ 1\n"
+                  "B2\n"
+                  "1 REF __calls_when\n"
+                  "1 REF i\n"
+                  "0 RUN __get__\n"
+                  "0 OUT todo\n"
+                  "B2\n"
+                  "0 RUN todo\n"
+                  "B0\n"
+                  "0 JMP -1\n"
+                  "B0\n"
+                  "0 DEL _l0\n"
+                  "B0\n");
 }
 
 void PikaStdTask_Task_run_always(PikaObj* self) {
@@ -46,3 +198,8 @@ void PikaStdTask_Task_run_always(PikaObj* self) {
         PikaStdTask_Task_run_once(self);
     }
 }
+
+void PikaStdTask_Task_platformGetTick(PikaObj* self) {
+    obj_setErrorCode(self, 1);
+    obj_setSysOut(self, "[error] platform method need to be override.");
+}

+ 7 - 0
package/STM32G0/STM32G0.py

@@ -1,5 +1,6 @@
 from PikaObj import *
 import PikaStdDevice
+import PikaStdTask
 
 
 class GPIO(PikaStdDevice.GPIO):
@@ -96,3 +97,9 @@ class IIC(PikaStdDevice.IIC):
 class lowLevel(TinyObj):
     def readPin(pin: str) -> int:
         pass
+
+
+class Task(PikaStdTask.Task):
+    # override
+    def platformGetTick():
+        pass

+ 10 - 0
package/STM32G0/STM32G0_Task.c

@@ -0,0 +1,10 @@
+#include <stdint.h>
+#include "BaseObj.h"
+#include "STM32G0_ADC.h"
+#include "STM32G0_common.h"
+#include "dataStrs.h"
+#include "main.h"
+
+void STM32G0_Task_platformGetTick(PikaObj* self) {
+    obj_setInt(self, "tick", HAL_GetTick());
+}