Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
Nodemcu Firmware
Commits
4f8f192c
Commit
4f8f192c
authored
Mar 01, 2016
by
TerryE
Browse files
Extend the node library to include a Lua implementation of task posting
parent
00cc4b42
Changes
3
Hide whitespace changes
Inline
Side-by-side
app/include/task/task.h
View file @
4f8f192c
...
@@ -17,10 +17,10 @@
...
@@ -17,10 +17,10 @@
* is just a fixed fingerprint and the count is allocated serially by the task get_id()
* is just a fixed fingerprint and the count is allocated serially by the task get_id()
* function.
* function.
*/
*/
#define task_post(priority,handle,param) system_os_post(priority, ((handle) | priority), param)
#define task_post_low(handle,param)
system_os_post(0, (handle |
TASK_PRIORITY_LOW
)
, param)
#define task_post_low(handle,param)
task_post(
TASK_PRIORITY_LOW
, handle
, param)
#define task_post_medium(handle,param)
system_os_post(1, (handle |
TASK_PRIORITY_MEDIUM
)
, param)
#define task_post_medium(handle,param)
task_post(
TASK_PRIORITY_MEDIUM
, handle
, param)
#define task_post_high(handle,param)
system_os_post(2, (handle |
TASK_PRIORITY_HIGH
)
, param)
#define task_post_high(handle,param)
task_post(
TASK_PRIORITY_HIGH
, handle
, param)
#define task_handle_t os_signal_t
#define task_handle_t os_signal_t
#define task_param_t os_param_t
#define task_param_t os_param_t
...
...
app/modules/node.c
View file @
4f8f192c
...
@@ -26,6 +26,7 @@
...
@@ -26,6 +26,7 @@
#include "flash_fs.h"
#include "flash_fs.h"
#include "user_version.h"
#include "user_version.h"
#include "rom.h"
#include "rom.h"
#include "task/task.h"
#define CPU80MHZ 80
#define CPU80MHZ 80
#define CPU160MHZ 160
#define CPU160MHZ 160
...
@@ -448,6 +449,39 @@ static int node_compile( lua_State* L )
...
@@ -448,6 +449,39 @@ static int node_compile( lua_State* L )
return
0
;
return
0
;
}
}
// Task callback handler for node.tasknow()
static
task_handle_t
do_node_task_handle
;
static
void
do_node_task
(
task_param_t
task_fn_ref
,
uint8_t
prio
)
{
UNUSED
(
prio
);
lua_State
*
L
=
lua_getstate
();
lua_rawgeti
(
L
,
LUA_REGISTRYINDEX
,
(
int
)
task_fn_ref
);
luaL_unref
(
L
,
LUA_REGISTRYINDEX
,
(
int
)
task_fn_ref
);
lua_pushinteger
(
L
,
prio
);
lua_call
(
L
,
1
,
0
);
}
// Lua: node.tasknow(task_cb)) -- schedule a task for execution next
static
int
node_task_post
(
lua_State
*
L
)
{
int
n
=
1
,
Ltype
=
lua_type
(
L
,
1
);
unsigned
priority
=
TASK_PRIORITY_MEDIUM
;
if
(
Ltype
==
LUA_TNUMBER
)
{
priority
=
(
unsigned
)
luaL_checkint
(
L
,
1
);
luaL_argcheck
(
L
,
priority
<=
TASK_PRIORITY_HIGH
,
1
,
"invalid priority"
);
Ltype
=
lua_type
(
L
,
++
n
);
}
luaL_argcheck
(
L
,
Ltype
==
LUA_TFUNCTION
||
Ltype
==
LUA_TLIGHTFUNCTION
,
n
,
"invalid function"
);
lua_pushvalue
(
L
,
n
);
int
task_fn_ref
=
luaL_ref
(
L
,
LUA_REGISTRYINDEX
);
if
(
!
do_node_task_handle
)
// bind the task handle to do_node_task on 1st call
do_node_task_handle
=
task_get_id
(
do_node_task
);
task_post
(
priority
,
do_node_task_handle
,
(
task_param_t
)
task_fn_ref
);
}
// Lua: setcpufreq(mhz)
// Lua: setcpufreq(mhz)
// mhz is either CPU80MHZ od CPU160MHZ
// mhz is either CPU80MHZ od CPU160MHZ
static
int
node_setcpufreq
(
lua_State
*
L
)
static
int
node_setcpufreq
(
lua_State
*
L
)
...
@@ -554,29 +588,37 @@ static int node_stripdebug (lua_State *L) {
...
@@ -554,29 +588,37 @@ static int node_stripdebug (lua_State *L) {
#endif
#endif
// Lua: node.egc.setmode( mode, [param])
// Lua: node.egc.setmode( mode, [param])
// where the mode is one of the node.egc constants NOT_ACTIVE , ON_ALLOC_FAILURE,
// where the mode is one of the node.egc constants NOT_ACTIVE , ON_ALLOC_FAILURE,
// ON_MEM_LIMIT, ALWAYS. In the case of ON_MEM_LIMIT an integer parameter is reqired
// ON_MEM_LIMIT, ALWAYS. In the case of ON_MEM_LIMIT an integer parameter is reqired
// See legc.h and lecg.c.
// See legc.h and lecg.c.
static
int
node_egc_setmode
(
lua_State
*
L
)
{
static
int
node_egc_setmode
(
lua_State
*
L
)
{
unsigned
mode
=
luaL_checkinteger
(
L
,
1
);
unsigned
mode
=
luaL_checkinteger
(
L
,
1
);
unsigned
limit
=
luaL_optinteger
(
L
,
2
,
0
);
unsigned
limit
=
luaL_optinteger
(
L
,
2
,
0
);
luaL_argcheck
(
L
,
mode
<=
(
EGC_ON_ALLOC_FAILURE
|
EGC_ON_MEM_LIMIT
|
EGC_ALWAYS
),
1
,
"invalid mode"
);
luaL_argcheck
(
L
,
mode
<=
(
EGC_ON_ALLOC_FAILURE
|
EGC_ON_MEM_LIMIT
|
EGC_ALWAYS
),
1
,
"invalid mode"
);
luaL_argcheck
(
L
,
!
(
mode
&
EGC_ON_MEM_LIMIT
)
||
limit
>
0
,
1
,
"limit must be non-zero"
);
luaL_argcheck
(
L
,
!
(
mode
&
EGC_ON_MEM_LIMIT
)
||
limit
>
0
,
1
,
"limit must be non-zero"
);
legc_set_mode
(
L
,
mode
,
limit
);
legc_set_mode
(
L
,
mode
,
limit
);
return
0
;
return
0
;
}
}
// Module function map
// Module function map
static
const
LUA_REG_TYPE
node_egc_map
[]
=
{
static
const
LUA_REG_TYPE
node_egc_map
[]
=
{
{
LSTRKEY
(
"setmode"
),
LFUNCVAL
(
node_egc_setmode
)
},
{
LSTRKEY
(
"setmode"
),
LFUNCVAL
(
node_egc_setmode
)
},
{
LSTRKEY
(
"NOT_ACTIVE"
),
LNUMVAL
(
EGC_NOT_ACTIVE
)
},
{
LSTRKEY
(
"NOT_ACTIVE"
),
LNUMVAL
(
EGC_NOT_ACTIVE
)
},
{
LSTRKEY
(
"ON_ALLOC_FAILURE"
),
LNUMVAL
(
EGC_ON_ALLOC_FAILURE
)
},
{
LSTRKEY
(
"ON_ALLOC_FAILURE"
),
LNUMVAL
(
EGC_ON_ALLOC_FAILURE
)
},
{
LSTRKEY
(
"ON_MEM_LIMIT"
),
LNUMVAL
(
EGC_ON_MEM_LIMIT
)
},
{
LSTRKEY
(
"ON_MEM_LIMIT"
),
LNUMVAL
(
EGC_ON_MEM_LIMIT
)
},
{
LSTRKEY
(
"ALWAYS"
),
LNUMVAL
(
EGC_ALWAYS
)
},
{
LSTRKEY
(
"ALWAYS"
),
LNUMVAL
(
EGC_ALWAYS
)
},
{
LNILKEY
,
LNILVAL
}
{
LNILKEY
,
LNILVAL
}
};
};
static
const
LUA_REG_TYPE
node_task_map
[]
=
{
{
LSTRKEY
(
"post"
),
LFUNCVAL
(
node_task_post
)
},
{
LSTRKEY
(
"LOW_PRIORITY"
),
LNUMVAL
(
TASK_PRIORITY_LOW
)
},
{
LSTRKEY
(
"MEDIUM_PRIORITY"
),
LNUMVAL
(
TASK_PRIORITY_MEDIUM
)
},
{
LSTRKEY
(
"HIGH_PRIORITY"
),
LNUMVAL
(
TASK_PRIORITY_HIGH
)
},
{
LNILKEY
,
LNILVAL
}
};
static
const
LUA_REG_TYPE
node_map
[]
=
static
const
LUA_REG_TYPE
node_map
[]
=
{
{
{
LSTRKEY
(
"restart"
),
LFUNCVAL
(
node_restart
)
},
{
LSTRKEY
(
"restart"
),
LFUNCVAL
(
node_restart
)
},
...
@@ -603,7 +645,8 @@ static const LUA_REG_TYPE node_map[] =
...
@@ -603,7 +645,8 @@ static const LUA_REG_TYPE node_map[] =
#ifdef LUA_OPTIMIZE_DEBUG
#ifdef LUA_OPTIMIZE_DEBUG
{
LSTRKEY
(
"stripdebug"
),
LFUNCVAL
(
node_stripdebug
)
},
{
LSTRKEY
(
"stripdebug"
),
LFUNCVAL
(
node_stripdebug
)
},
#endif
#endif
{
LSTRKEY
(
"egc"
),
LROVAL
(
node_egc_map
)
},
{
LSTRKEY
(
"egc"
),
LROVAL
(
node_egc_map
)
},
{
LSTRKEY
(
"task"
),
LROVAL
(
node_task_map
)
},
// Combined to dsleep(us, option)
// Combined to dsleep(us, option)
// { LSTRKEY( "dsleepsetoption" ), LFUNCVAL( node_deepsleep_setoption) },
// { LSTRKEY( "dsleepsetoption" ), LFUNCVAL( node_deepsleep_setoption) },
...
...
docs/en/modules/node.md
View file @
4f8f192c
...
@@ -403,3 +403,42 @@ provides more detailed information on the EGC.
...
@@ -403,3 +403,42 @@ provides more detailed information on the EGC.
`node.egc.setmode(node.egc.ALWAYS, 4096) -- This is the default setting at startup.`
`node.egc.setmode(node.egc.ALWAYS, 4096) -- This is the default setting at startup.`
`node.egc.setmode(node.egc.ON_ALLOC_FAILURE) -- This is the fastest activeEGC mode.`
`node.egc.setmode(node.egc.ON_ALLOC_FAILURE) -- This is the fastest activeEGC mode.`
# node.task module
## node.task.post()
Enable a Lua callback or task to post another task request. Note that as per the
example multiple tasks can be posted in any task, but the highest priority is
always delivered first.
####Syntax
`node.task.post([task_priority], function)`
#### Parameters
-
`task_priority`
(optional)
-
`node.task.LOW_PRIORITY`
= 0
-
`node.task.MEDIUM_PRIORITY`
= 1
-
`node.task.HIGH_PRIORITY`
= 2
-
`function`
a callback function to be executed when the task is run.
If the priority is omitted then this defaults to
`node.task.MEDIUM_PRIORITY`
#### Returns
`nil`
#### Example
```
lua
for
i
=
node
.
task
.
LOW_PRIORITY
,
node
.
task
.
HIGH_PRIORITY
do
node
.
task
.
post
(
i
,
function
(
p2
)
print
(
"priority is ..p2)
end)
end
```
prints
```
priority is 2
priority is 1
priority is 0
```
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment