页次: 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#define MMAP_DATA_SIZE 1024
char *data = NULL;
pthread_t pid_sub;
//子线程
void *subthread(void *arg)
{
if( data ) {
memset(data, 0xff, 20); // 发生segment fault
printf("subthread memset.\n");
}
}
//主线程
int main(void)
{
int rc=0;
int fd = shm_open("shm0001", O_CREAT|O_RDWR, 0777);
if (fd < 0) {
printf("shm_open failed!\n");
return -1;
}
ftruncate(fd, MMAP_DATA_SIZE);
data = (char*)mmap(NULL, 1024, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
// 创建子线程
rc = pthread_create(&pid_sub, NULL, subthread, NULL);
while(1) {
sleep(1);
}
}
compile: gcc test.c -lrt -lpthread -o test
测试没问题
5楼正解,
RAW模式,每次读1字节,读到的立即送FIFO,外部再从FIFO取出数据解析帧头帧尾.
实际上这样才是最解放CPU的,这样的方式可以方便的处理多种协议,兼容性强.
物理串口芯片中一般也都有硬件FIFO,可以设置收发多少字节触发中断wiring通知内核.
中断也是给内核tty设备用的,所有内核已经解决了负载均衡问题.你担心的读取长度不同有影响,
仅是处在应用层看问题,事实上应用读取的是tty已读取完的数据,不管有没有数据都会立即返回.
换句话说,不管应用层是否去读,数据都会先交给tty了,只是谁来读,什么时候来读的问题.
至于是否对系统造成负担.这个还是内核层面的问题,串口的波特率这么低!!!51都胜任,linux?!
多核CPU,也只会有一个核去相应中断并处理,更不会造成负担.
linux读取串口的实时性应该没差啊,应该是收到接受中断后立即处理了,linux的中断响应虽然
没法跟抢占式调度相比,但是对于串口,这个反应速度肯定低于一个串口波特率位时长的,无需担心.
应用可能没有及时处理吧,并不是linux内核没有及时处理.循环read加sleep就可以.仅调度不到
时会慢收1个字节,相信对应用逻辑没什么影响.
页次: 1