ram-segments.c

来自「伟大的Contiki工程, 短小精悍 的操作系统, 学习编程不可不看」· C语言 代码 · 共 141 行

C
141
字号
#ifndef __RAM_SEGMENTS_C__1POIF5E8U4__#define __RAM_SEGMENTS_C__1POIF5E8U4__#include <loader/elfloader-otf.h>#include <loader/codeprop-otf.h>#include <sys/types.h>#include <lib/malloc.h>#include <string.h>#include <stdio.h>struct ram_output{  struct elfloader_output output;  char *base;  unsigned int offset;  void *text;  void *rodata;  void *data;  void *bss;};static void *allocate_segment(struct elfloader_output * const output,		 unsigned int type, int size){  struct ram_output * const ram = (struct ram_output *)output;  void *block = malloc(size);  if (!block) return NULL;  switch(type) {  case ELFLOADER_SEG_TEXT:    if (ram->text) free(ram->text);    ram->text = block;    break;  case ELFLOADER_SEG_RODATA:    if (ram->rodata) free(ram->rodata);    ram->rodata = block;    break;  case ELFLOADER_SEG_DATA:    if (ram->data) free(ram->data);    ram->data = block;    break;  case ELFLOADER_SEG_BSS:    if (ram->bss) free(ram->bss);    ram->bss = block;    break;  default:    free(block);    return NULL;  }  return block;}static intstart_segment(struct elfloader_output *output,			unsigned int type, void *addr, int size){  ((struct ram_output*)output)->base = addr;  ((struct ram_output*)output)->offset = 0;  return ELFLOADER_OK;}static intend_segment(struct elfloader_output *output){  return ELFLOADER_OK;}static intwrite_segment(struct elfloader_output *output, const char *buf,	      unsigned int len){  struct ram_output * const ram = (struct ram_output *)output;  memcpy(ram->base + ram->offset, buf, len);  ram->offset += len;  return len;}static unsigned intsegment_offset(struct elfloader_output *output){  return ((struct ram_output*)output)->offset;}static const struct elfloader_output_ops elf_output_ops =  {    allocate_segment,    start_segment,    end_segment,    write_segment,    segment_offset  };static struct ram_output seg_output = {  {&elf_output_ops},  NULL,  0,  NULL,  NULL,  NULL,  NULL};PROCESS(ram_segments_cleanup_process, "RAM segments cleanup process");PROCESS_THREAD(ram_segments_cleanup_process, ev, data){  PROCESS_BEGIN();  while(1) {    PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_EXITED			     || ev == PROCESS_EVENT_EXIT);    if (ev == PROCESS_EVENT_EXIT) break;    if (elfloader_autostart_processes ||	elfloader_autostart_processes[0] == data) {      PROCESS_PAUSE(); /* Let the process exit */      if (seg_output.text) {	free(seg_output.text);	seg_output.text = NULL;      }      if (seg_output.rodata) {	free(seg_output.rodata);	seg_output.rodata = NULL;      }      if (seg_output.data) {	free(seg_output.data);	seg_output.data = NULL;      }            if (seg_output.bss) {	free(seg_output.bss);	seg_output.bss = NULL;      }      elfloader_autostart_processes = NULL;    }  }  PROCESS_END();}struct elfloader_output *codeprop_output = &seg_output.output;#endif /* __RAM_SEGMENTS_C__1POIF5E8U4__ */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?