static void load_script( uint8_t *script, uint8_t size ) { codemem_t cm = ker_codemem_alloc(size, CODEMEM_TYPE_EXECUTABLE); ker_codemem_write( cm, THIS_MODULE_ID, script, size, 0); ker_codemem_flush( cm, THIS_MODULE_ID); post_short(script[0], THIS_MODULE_ID, MSG_LOADER_DATA_AVAILABLE, script[1], cm, 0); return; }
static int8_t request_new_module(sos_cam_t key, loader_cam_t *cam, uint8_t size, uint16_t saddr, uint8_t type) { cam->code_size = size; cam->fetcher.fetchtype = type; cam->fetcher.cm = ker_codemem_alloc( size * LOADER_SIZE_MULTIPLIER, CODEMEM_TYPE_EXECUTABLE); DEBUG_PID( KER_DFT_LOADER_PID, "request new module with size = %d\n", size * LOADER_SIZE_MULTIPLIER); if(cam->fetcher.cm == CODEMEM_INVALID) { return -ENOMEM; } if( fetcher_request( KER_DFT_LOADER_PID, key, (uint16_t)size * LOADER_SIZE_MULTIPLIER, saddr ) != SOS_OK ) { ker_codemem_free( cam->fetcher.cm ); return -ENOMEM; } block_protocol(); return SOS_OK; }
static void start_experiment(uint16_t size) { sos_cam_t key; loader_cam_t *cam; codemem_t cm; uint8_t buf[2]; buf[0] = 128; buf[1] = 1; DEBUG_PID(KER_DFT_LOADER_PID, "start experiment: size = %d\n", size); cm = ker_codemem_alloc( size, CODEMEM_TYPE_EXECUTABLE); ker_codemem_write(cm, KER_DFT_LOADER_PID, buf, 2, 0); cam = ker_malloc(sizeof(loader_cam_t), KER_DFT_LOADER_PID); st.version_data->pam_ver[0]++; st.version_data->pam_size[0] = (size + (LOADER_SIZE_MULTIPLIER - 1)) / LOADER_SIZE_MULTIPLIER; st.version_data->version ++; key = ker_cam_key( KER_DFT_LOADER_PID, 0 ); cam->fetcher.fetchtype = FETCHTYPE_DATA; cam->fetcher.cm = cm; ker_cam_add(key, cam); restartInterval(0); }