我有一组范围,如{(2-8),(13-22),(380-7931),(40032-63278)}.为简单起见,我们可以假设它们不重叠(重叠范围已经合并).
我的目标是使用一组给定的"长度"组合来"覆盖"这些范围,例如{4,64,1024,16384}.我被限制使用最多N个长度,例如N = 32.我不关心我使用多少"长度",只要我低于我的最大值,但我想最小化总"额外"区域 - 数字"覆盖"长度不在初始范围集中.
由(2-66)覆盖的示例{(2-8)}(使用的一个长度为64)具有58个"额外"数字.由{(2-6),(6-10)}(两个长度为4)覆盖的{(2-8)}仅具有2个"额外"数字并且是优选的.
我的真实世界应用程序涉及对固定MMU TLB进行预编程,以确保只能访问某些范围的内存地址(TLB未命中因此代表禁止访问并且可以相应地处理).我想尽可能紧覆盖范围,从而侵犯被抓住宜早不宜迟,但我只有32个插槽,工作和4个固定页面大小.我可以手动调整我的代码到足够的性能水平,但我很好奇是否有更优雅/通用的解决方案.它似乎与背包问题有关,但不同的是它很难搜索.
我正在维护一些通过SPI与FPGA通信的用户空间代码.现在正在轮询,看看是否有数据可以采取行动,我并不感到兴奋.comm线程的(大大简化)结构如下所示:
int spi_fd;
void do_transfer(char *buf, int len)
{
struct spi_ioc_transfer xfer;
memset(xfer, 0, sizeof(xfer));
ioctl_tell_some_fpga_register_heads_up();
xfer[0].len = len;
xfer[0].tx_buf = NULL;
xfer[0].rx_buf = buf;
ioctl(spi_fd, SPI_IOC_MESSAGE(1), xfer);
ioctl_tell_some_fpga_register_were_done();
}
void *comm_thread(void arg)
{
uint8_t config = SPI_MODE_3;
__u32 speed = 4000000;
char buffer[5120];
spi_fd = open("/dev/spidev1.0", O_RDWR);
ioctl(spi_fd, SPI_IOC_WR_MODE, &config);
ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
while(1) {
sleep(2); //ugh
if(ioctl_read_some_fpga_register_that_says_if_theres_data())
{
do_transfer(buffer, some_small_number_of_bytes());
do_stuff(buffer); //you get the picture
}
}
}
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢在轮询和睡眠的基于事件的解决方案.首先想到的是在spidev文件描述符上执行select()而不是每X秒检查一次寄存器,类似于
fd_set myset;
while(1) {
FD_ZERO(&myset);
FD_SET(spi_fd, &myset); …
Run Code Online (Sandbox Code Playgroud) 试图提高我的C++和STL熟练程度,遇到由我定义的结构键入的std :: map的问题.相关代码:
typedef struct key_t {
int a;
int b;
bool operator==(const key_t& rhs)
{
return (a == rhs.a) && (b == rhs.b);
}
bool operator<(const key_t& rhs) //added the when I saw this error, didn't help
{
return a < rhs.a;
}
} key_t;
std::map<key_t, int> fooMap;
void func(void)
{
key_t key;
key.a = 1;
key.b = 2;
fooMap.insert(std::pair<key_t, int>(key, 100));
}
Run Code Online (Sandbox Code Playgroud)
错误看起来像这样:
"/opt/[redacted]/include/functional", line 133: error: no operator "<" matches these operands
operand types are: const key_t …
Run Code Online (Sandbox Code Playgroud) 我正在使用一个内部软件工具,显示和记录从我开发嵌入式软件的产品的串行调试端口收集的格式化诊断数据.这是在C和非常老.它是使用Borland Turbo-C v1.01(1990版权所有)构建的.如果可能的话,我宁愿修改而不是为现代环境重写工具.
我想一次从多个设备收集调试数据.我设想了几个通过USB->串行适配器连接到集线器的设备,连接到PC(运行Windows XP).在每个设备上运行一个诊断工具实例(同样,在Windows中),指向相应的COM端口.容易,对吗?
不完全的.观察我正在使用的串口初始化函数:
void serinit(int baudrate, char paristat, char adaptnum) {
int hibcon, lobcon, paricon;
if(adaptnum == '3') {
sioreg = lowbaud = 0x3E8; // SIO (Serial I/O Reg.)
intenreg = highbaud = 0x3E9; // IER (Interrupt Enable Reg.)
intidreg = 0x3EA; // IIR (Interrupt Ident. Reg.)
linecon = 0x3EB; // LCR (Line Control Reg.)
modemcon = 0x3EC; // MCR (Modem Control Reg.)
linestat = 0x3ED; // LSR (Line Status Reg.)
modemstat = 0x3EE; // MSR (Modem …
Run Code Online (Sandbox Code Playgroud)