Various minor bits of cleanup (#1647)
* Check the return code of the read function when doing crypto.fhash so that we don't pass negative lengths to the hashing functions * Fix various assert failures in the LVM arising from rotables. No functional change * Add the gpio interrupt time to the callback (and pass it from the interrupt handler) * Get the PC right in the perf module * Make the headers static in the websocket module * Fix the documentation
This commit is contained in:
parent
118acb808e
commit
feab8b2208
|
@ -144,7 +144,9 @@ int ICACHE_FLASH_ATTR crypto_fhash (const digest_mech_info_t *mi,
|
||||||
int read_len = 0;
|
int read_len = 0;
|
||||||
do {
|
do {
|
||||||
read_len = read(readarg, buffer, mi->block_size);
|
read_len = read(readarg, buffer, mi->block_size);
|
||||||
mi->update (ctx, buffer, read_len);
|
if (read_len > 0) {
|
||||||
|
mi->update (ctx, buffer, read_len);
|
||||||
|
}
|
||||||
} while (read_len == mi->block_size);
|
} while (read_len == mi->block_size);
|
||||||
|
|
||||||
// Finish up
|
// Finish up
|
||||||
|
|
|
@ -412,6 +412,7 @@ LUA_API const void *lua_topointer (lua_State *L, int idx) {
|
||||||
case LUA_TLIGHTUSERDATA:
|
case LUA_TLIGHTUSERDATA:
|
||||||
return lua_touserdata(L, idx);
|
return lua_touserdata(L, idx);
|
||||||
case LUA_TROTABLE:
|
case LUA_TROTABLE:
|
||||||
|
return rvalue(o);
|
||||||
case LUA_TLIGHTFUNCTION:
|
case LUA_TLIGHTFUNCTION:
|
||||||
return pvalue(o);
|
return pvalue(o);
|
||||||
default: return NULL;
|
default: return NULL;
|
||||||
|
|
|
@ -105,8 +105,9 @@ static Node *mainposition (const Table *t, const TValue *key) {
|
||||||
return hashstr(t, rawtsvalue(key));
|
return hashstr(t, rawtsvalue(key));
|
||||||
case LUA_TBOOLEAN:
|
case LUA_TBOOLEAN:
|
||||||
return hashboolean(t, bvalue(key));
|
return hashboolean(t, bvalue(key));
|
||||||
case LUA_TLIGHTUSERDATA:
|
|
||||||
case LUA_TROTABLE:
|
case LUA_TROTABLE:
|
||||||
|
return hashpointer(t, rvalue(key));
|
||||||
|
case LUA_TLIGHTUSERDATA:
|
||||||
case LUA_TLIGHTFUNCTION:
|
case LUA_TLIGHTFUNCTION:
|
||||||
return hashpointer(t, pvalue(key));
|
return hashpointer(t, pvalue(key));
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -292,8 +292,9 @@ int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) {
|
||||||
case LUA_TNIL: return 1;
|
case LUA_TNIL: return 1;
|
||||||
case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2));
|
case LUA_TNUMBER: return luai_numeq(nvalue(t1), nvalue(t2));
|
||||||
case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */
|
case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */
|
||||||
case LUA_TLIGHTUSERDATA:
|
|
||||||
case LUA_TROTABLE:
|
case LUA_TROTABLE:
|
||||||
|
return rvalue(t1) == rvalue(t2);
|
||||||
|
case LUA_TLIGHTUSERDATA:
|
||||||
case LUA_TLIGHTFUNCTION:
|
case LUA_TLIGHTFUNCTION:
|
||||||
return pvalue(t1) == pvalue(t2);
|
return pvalue(t1) == pvalue(t2);
|
||||||
case LUA_TUSERDATA: {
|
case LUA_TUSERDATA: {
|
||||||
|
|
|
@ -34,10 +34,19 @@ static int gpio_cb_ref[GPIO_PIN_NUM];
|
||||||
// It also re-enables the pin interrupt, so that we get another callback queued
|
// It also re-enables the pin interrupt, so that we get another callback queued
|
||||||
static void gpio_intr_callback_task (task_param_t param, uint8 priority)
|
static void gpio_intr_callback_task (task_param_t param, uint8 priority)
|
||||||
{
|
{
|
||||||
unsigned pin = param >> 1;
|
uint32_t then = (param >> 8) & 0xffffff;
|
||||||
unsigned level = param & 1;
|
uint32_t pin = (param >> 1) & 127;
|
||||||
|
uint32_t level = param & 1;
|
||||||
UNUSED(priority);
|
UNUSED(priority);
|
||||||
|
|
||||||
|
uint32_t now = system_get_time();
|
||||||
|
|
||||||
|
// Now must be >= then . Add the missing bits
|
||||||
|
if (then > (now & 0xffffff)) {
|
||||||
|
then += 0x1000000;
|
||||||
|
}
|
||||||
|
then = (then + (now & 0x7f000000)) & 0x7fffffff;
|
||||||
|
|
||||||
NODE_DBG("pin:%d, level:%d \n", pin, level);
|
NODE_DBG("pin:%d, level:%d \n", pin, level);
|
||||||
if(gpio_cb_ref[pin] != LUA_NOREF) {
|
if(gpio_cb_ref[pin] != LUA_NOREF) {
|
||||||
// GPIO callbacks are run in L0 and inlcude the level as a parameter
|
// GPIO callbacks are run in L0 and inlcude the level as a parameter
|
||||||
|
@ -52,7 +61,8 @@ static void gpio_intr_callback_task (task_param_t param, uint8 priority)
|
||||||
// Do the actual callback
|
// Do the actual callback
|
||||||
lua_rawgeti(L, LUA_REGISTRYINDEX, gpio_cb_ref[pin]);
|
lua_rawgeti(L, LUA_REGISTRYINDEX, gpio_cb_ref[pin]);
|
||||||
lua_pushinteger(L, level);
|
lua_pushinteger(L, level);
|
||||||
lua_call(L, 1, 0);
|
lua_pushinteger(L, then);
|
||||||
|
lua_call(L, 2, 0);
|
||||||
|
|
||||||
if (INTERRUPT_TYPE_IS_LEVEL(pin_int_type[pin])) {
|
if (INTERRUPT_TYPE_IS_LEVEL(pin_int_type[pin])) {
|
||||||
// Level triggered -- re-enable the callback
|
// Level triggered -- re-enable the callback
|
||||||
|
|
|
@ -24,7 +24,6 @@ typedef struct {
|
||||||
uint32_t bucket_count;
|
uint32_t bucket_count;
|
||||||
uint32_t total_samples;
|
uint32_t total_samples;
|
||||||
uint32_t outside_samples;
|
uint32_t outside_samples;
|
||||||
uint32_t pc_offset;
|
|
||||||
uint32_t bucket[1];
|
uint32_t bucket[1];
|
||||||
} DATA;
|
} DATA;
|
||||||
|
|
||||||
|
@ -39,7 +38,11 @@ static void ICACHE_RAM_ATTR hw_timer_cb(os_param_t p)
|
||||||
uint32_t stackaddr;
|
uint32_t stackaddr;
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
uint32_t pc = *(&stackaddr + data->pc_offset);
|
uint32_t pc;
|
||||||
|
asm (
|
||||||
|
"rsr %0, EPC1;" /* read out the EPC */
|
||||||
|
:"=r"(pc)
|
||||||
|
);
|
||||||
|
|
||||||
uint32_t bucket_number = (pc - data->start) >> data->bucket_shift;
|
uint32_t bucket_number = (pc - data->start) >> data->bucket_shift;
|
||||||
if (bucket_number < data->bucket_count) {
|
if (bucket_number < data->bucket_count) {
|
||||||
|
@ -72,11 +75,6 @@ static int perf_start(lua_State *L)
|
||||||
|
|
||||||
bins = (end - start + (1 << shift) - 1) / (1 << shift);
|
bins = (end - start + (1 << shift) - 1) / (1 << shift);
|
||||||
|
|
||||||
int pc_offset = 20; // This appears to be correct
|
|
||||||
if (lua_gettop(L) >= 4) {
|
|
||||||
pc_offset = luaL_checkinteger(L, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t data_size = sizeof(DATA) + bins * sizeof(uint32_t);
|
size_t data_size = sizeof(DATA) + bins * sizeof(uint32_t);
|
||||||
DATA *d = (DATA *) lua_newuserdata(L, data_size);
|
DATA *d = (DATA *) lua_newuserdata(L, data_size);
|
||||||
memset(d, 0, data_size);
|
memset(d, 0, data_size);
|
||||||
|
@ -84,7 +82,6 @@ static int perf_start(lua_State *L)
|
||||||
d->start = start;
|
d->start = start;
|
||||||
d->bucket_shift = shift;
|
d->bucket_shift = shift;
|
||||||
d->bucket_count = bins;
|
d->bucket_count = bins;
|
||||||
d->pc_offset = pc_offset;
|
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
lua_unref(L, data->ref);
|
lua_unref(L, data->ref);
|
||||||
|
|
|
@ -204,6 +204,7 @@ int platform_gpio_read( unsigned pin )
|
||||||
static void ICACHE_RAM_ATTR platform_gpio_intr_dispatcher (void *dummy){
|
static void ICACHE_RAM_ATTR platform_gpio_intr_dispatcher (void *dummy){
|
||||||
uint32 j=0;
|
uint32 j=0;
|
||||||
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
|
uint32 gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
|
||||||
|
uint32 now = system_get_time();
|
||||||
UNUSED(dummy);
|
UNUSED(dummy);
|
||||||
|
|
||||||
#ifdef GPIO_INTERRUPT_HOOK_ENABLE
|
#ifdef GPIO_INTERRUPT_HOOK_ENABLE
|
||||||
|
@ -229,7 +230,7 @@ static void ICACHE_RAM_ATTR platform_gpio_intr_dispatcher (void *dummy){
|
||||||
//clear interrupt status
|
//clear interrupt status
|
||||||
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(j));
|
GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(j));
|
||||||
uint32 level = 0x1 & GPIO_INPUT_GET(GPIO_ID_PIN(j));
|
uint32 level = 0x1 & GPIO_INPUT_GET(GPIO_ID_PIN(j));
|
||||||
task_post_high (gpio_task_handle, (i<<1) + level);
|
task_post_high (gpio_task_handle, (now << 8) + (i<<1) + level);
|
||||||
// We re-enable the interrupt when we execute the callback
|
// We re-enable the interrupt when we execute the callback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -69,12 +69,12 @@
|
||||||
#define WS_OPCODE_PING 0x9
|
#define WS_OPCODE_PING 0x9
|
||||||
#define WS_OPCODE_PONG 0xA
|
#define WS_OPCODE_PONG 0xA
|
||||||
|
|
||||||
header_t DEFAULT_HEADERS[] = {
|
static const header_t DEFAULT_HEADERS[] = {
|
||||||
{"User-Agent", "ESP8266"},
|
{"User-Agent", "ESP8266"},
|
||||||
{"Sec-WebSocket-Protocol", "chat"},
|
{"Sec-WebSocket-Protocol", "chat"},
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
header_t *EMPTY_HEADERS = DEFAULT_HEADERS + sizeof(DEFAULT_HEADERS) / sizeof(header_t) - 1;
|
static const header_t *EMPTY_HEADERS = DEFAULT_HEADERS + sizeof(DEFAULT_HEADERS) / sizeof(header_t) - 1;
|
||||||
|
|
||||||
static char *cryptoSha1(char *data, unsigned int len) {
|
static char *cryptoSha1(char *data, unsigned int len) {
|
||||||
SHA1_CTX ctx;
|
SHA1_CTX ctx;
|
||||||
|
@ -132,7 +132,7 @@ static char *_strcpy(char *dst, char *src) {
|
||||||
return dst - 1;
|
return dst - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int headers_length(header_t *headers) {
|
static int headers_length(const header_t *headers) {
|
||||||
int length = 0;
|
int length = 0;
|
||||||
for(; headers->key; headers++)
|
for(; headers->key; headers++)
|
||||||
length += strlen(headers->key) + strlen(headers->value) + 4;
|
length += strlen(headers->key) + strlen(headers->value) + 4;
|
||||||
|
@ -595,7 +595,7 @@ static void connect_callback(void *arg) {
|
||||||
{0}
|
{0}
|
||||||
};
|
};
|
||||||
|
|
||||||
header_t *extraHeaders = ws->extraHeaders ? ws->extraHeaders : EMPTY_HEADERS;
|
const header_t *extraHeaders = ws->extraHeaders ? ws->extraHeaders : EMPTY_HEADERS;
|
||||||
|
|
||||||
char buf[WS_INIT_REQUEST_LENGTH + strlen(ws->path) + strlen(ws->hostname) +
|
char buf[WS_INIT_REQUEST_LENGTH + strlen(ws->path) + strlen(ws->hostname) +
|
||||||
headers_length(DEFAULT_HEADERS) + headers_length(headers) + headers_length(extraHeaders) + 2];
|
headers_length(DEFAULT_HEADERS) + headers_length(headers) + headers_length(extraHeaders) + 2];
|
||||||
|
|
|
@ -125,9 +125,11 @@ This function is not available if GPIO_INTERRUPT_ENABLE was undefined at compile
|
||||||
- `type` "up", "down", "both", "low", "high", which represent *rising edge*, *falling edge*, *both
|
- `type` "up", "down", "both", "low", "high", which represent *rising edge*, *falling edge*, *both
|
||||||
edges*, *low level*, and *high level* trigger modes respectivey. If the type is "none" or omitted
|
edges*, *low level*, and *high level* trigger modes respectivey. If the type is "none" or omitted
|
||||||
then the callback function is removed and the interrupt is disabled.
|
then the callback function is removed and the interrupt is disabled.
|
||||||
- `callback_function(level)` callback function when trigger occurs. The level of the specified pin
|
- `callback_function(level, when)` callback function when trigger occurs. The level of the specified pin
|
||||||
at the interrupt passed as the parameter to the callback. The previous callback function will be
|
at the interrupt passed as the first parameter to the callback. The timestamp of the event is passed
|
||||||
used if the function is omitted.
|
as the second parameter. This is in microseconds and has the same base as for `tmr.now()`. This timestamp
|
||||||
|
is grabbed at interrupt level and is more consistent than getting the time in the callback function.
|
||||||
|
The previous callback function will be used if the function is omitted.
|
||||||
|
|
||||||
#### Returns
|
#### Returns
|
||||||
`nil`
|
`nil`
|
||||||
|
@ -139,8 +141,7 @@ do
|
||||||
-- use pin 1 as the input pulse width counter
|
-- use pin 1 as the input pulse width counter
|
||||||
local pin, pulse1, du, now, trig = 1, 0, 0, tmr.now, gpio.trig
|
local pin, pulse1, du, now, trig = 1, 0, 0, tmr.now, gpio.trig
|
||||||
gpio.mode(pin,gpio.INT)
|
gpio.mode(pin,gpio.INT)
|
||||||
local function pin1cb(level)
|
local function pin1cb(level, pulse2)
|
||||||
local pulse2 = now()
|
|
||||||
print( level, pulse2 - pulse1 )
|
print( level, pulse2 - pulse1 )
|
||||||
pulse1 = pulse2
|
pulse1 = pulse2
|
||||||
trig(pin, level == gpio.HIGH and "down" or "up")
|
trig(pin, level == gpio.HIGH and "down" or "up")
|
||||||
|
|
|
@ -11,15 +11,13 @@ of memory to store the histogram, the user can specify which area of code is of
|
||||||
Starts a performance monitoring session.
|
Starts a performance monitoring session.
|
||||||
|
|
||||||
#### Syntax
|
#### Syntax
|
||||||
`perf.start([start[, end[, nbins[, offset]]]])`
|
`perf.start([start[, end[, nbins]]])`
|
||||||
|
|
||||||
#### Parameters
|
#### Parameters
|
||||||
- `start` (optional) The lowest PC address for the histogram. Default is 0x40000000.
|
- `start` (optional) The lowest PC address for the histogram. Default is 0x40000000.
|
||||||
- `end` (optional) The highest address for the histogram. Default is the end of the used space in the flash memory.
|
- `end` (optional) The highest address for the histogram. Default is the end of the used space in the flash memory.
|
||||||
- `nbins` (optional) The number of bins in the histogram. Keep this reasonable otherwise
|
- `nbins` (optional) The number of bins in the histogram. Keep this reasonable otherwise
|
||||||
you will run out of memory. Default is 1024.
|
you will run out of memory. Default is 1024.
|
||||||
- `offset` (Very optional) This specifies the offset of the saved PC value
|
|
||||||
on the interrupt stack. It appears that 20 is the correct value.
|
|
||||||
|
|
||||||
Note that the number of bins is an upper limit. The size of each bin is set to be the smallest power of two
|
Note that the number of bins is an upper limit. The size of each bin is set to be the smallest power of two
|
||||||
such that the number of bins required is less than or equal to the provided number of bins.
|
such that the number of bins required is less than or equal to the provided number of bins.
|
||||||
|
|
Loading…
Reference in New Issue