嵌入式系统无需操作系统的数据库

时间:2012-07-12 13:54:57

标签: c database operating-system embedded system

是否有任何数据库不需要操作系统来执行操作?如果是,请提供详细信息或详细链接。

编程语言是C。

嵌入式系统编程需要。

1 个答案:

答案 0 :(得分:4)

嗯,这取决于你如何定义'操作系统'。

  • 如果您将其定义为具有在x86硬件上运行的GUI的内容;当然;大多数数据库在其他系统上运行得很好。
  • 如果你把它定义为实现POSIX规范的东西,或者允许线程或进程运行并提供一定程度的安全性,那么你就会失去一些需要多线程操作的东西,但你仍然会很好;有很多选择。
  • 如果你把它定义为根本没有任何文件操作的东西,并且没有实现很多C标准库,那你就差一点了。

基于ARM的设备几乎肯定有一个随工具链一起提供的C标准库。 Newlib是深度嵌入式系统的流行选择;它默认包含在,例如,免费的CodeSourcery和YARTGO工具链中。但是,在此之前,您需要实现一些系统调用。你能说,printf()并在控制台上显示文字吗? malloc()怎么样?如果这些和其他功能不起作用,我建议你实现它们。 Newlib期望的基本系统调用是:

int     _system       (const char *);
int     _rename       (const char *, const char *);
int     _isatty       (int);
clock_t _times        (struct tms *);
int     _gettimeofday (struct timeval *, struct timezone *);
void    _raise        (void);
int     _unlink       (void);
int     _link         (void);
int     _stat         (const char *, struct stat *);
int     _fstat        (int, struct stat *);
caddr_t _sbrk         (int);
int     _getpid       (int);
int     _kill         (int, int);
void    _exit         (int);
int     _close        (int);
int     _open         (const char *, int, ...);
int     _write        (int, char *, int);
int     _lseek        (int, int, int);
int     _read         (int, char *, int);

其中大多数可以是存根,但是您需要,例如,_write()用于printf()(和其他写入操作),_read()用于读取操作,_sbrk()用于malloc和其他内存管理功能。例如,请参阅http://wiki.osdev.org/Porting_Newlib以获得最小的实现。您对这些函数的定义将决定数据库的工作方式;如果_write()向UART发送一个字符,那么你的数据库将不会非常有用。

标准库有效,sqlite和其他数据库应该可以工作。他们会在sqlite amalgamation中的shell.c中做这样的事情:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"
#include <ctype.h>
#include <stdarg.h>
#include <signal.h>
#include <pwd.h>
#include <unistd.h>
#include <sys/types.h>

你需要一些实现。这不需要操作系统。使用C库,它可以工作,但没有一个,你就可以自己动手了。