【问题标题】:database without operating system required for embedded system嵌入式系统不需要操作系统的数据库
【发布时间】:2012-07-12 07:06:08
【问题描述】:

是否有不需要操作系统来执行操作的数据库?如果是,请提供尺寸等详细信息或包含详细信息的链接。

编程语言是 C。

嵌入式系统编程所必需的。

【问题讨论】:

  • 您能否通过编辑您的原始帖子详细说明您的意思是不需要操作系统?我假设你的意思是你寻找的数据库知道如何执行它自己的磁盘访问。我说的对吗?
  • 您为什么不想使用二进制文件创建自己的基于文件的数据库系统?我的意思是,您想要一个支持 SQL 语法的数据库?以及什么样的嵌入式设备?一个简单的 AVR/PIC/ARM 左右?它应该有多大/小的占地面积?
  • “为什么不呢?”因为虽然具有教育意义,但与多个具有该领域经验的开发人员开发的成熟数据库引擎相比,第一次尝试可能会很差。这也可能会浪费时间。
  • 它是一个基于 ARM 的设备。如果我在 SQL 语法中找到任何东西会更好,否则最后一个选项将只是二进制文件。
  • sqlite 对操作系统的依赖性很小;只要您可以在sqlite.org/custombuild.html 中提供挂钩,您就应该能够让它运行。谷歌搜索“sqlite 移植”将提供大量关于各种嵌入式系统端口的引用。如果您真的是在金属之上进行编程(不使用任何现有的代码库/现有内核),那么您将需要编写相当多的胶水。真的是这样吗?

标签: c database operating-system embedded system


【解决方案1】:

嗯,这取决于您如何定义“操作系统”。

  • 如果您将其定义为具有在 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 合并的 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 库,它就可以工作,但没有 C 库,你就得靠自己了。

【讨论】:

    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 2010-09-11
    • 2010-10-20
    • 2011-10-07
    • 1970-01-01
    • 2018-02-07
    相关资源
    最近更新 更多