我最近在看ardupilot的源码,它是运行在stm32的rtos上的,里面经常有:
struct position{
int32_t lat;
int32_t lng;
};
这样的结构体,如果一个任务进行写,一个任务读,写任务修改完lat进行了任务切换,由读任务进行读取,就会导致读到的strcut里lat是最新的值,lng是旧的值,这应该需要加锁来控制吧,ardupilot里大量使用了这样的结构体,但没有用锁,怎么保证正常运行的呢。其他平台的c c++编程应该也是类似
我最近在看ardupilot的源码,它是运行在stm32的rtos上的,里面经常有:
struct position{
int32_t lat;
int32_t lng;
};
这样的结构体,如果一个任务进行写,一个任务读,写任务修改完lat进行了任务切换,由读任务进行读取,就会导致读到的strcut里lat是最新的值,lng是旧的值,这应该需要加锁来控制吧,ardupilot里大量使用了这样的结构体,但没有用锁,怎么保证正常运行的呢。其他平台的c c++编程应该也是类似
如果是读写同一个结构体变量,那肯定多任务处理的时候会有问题。一般RTOS任务通讯都是申请一块临时的结构体空间,然后填充,通过消息队列把这个指针发送给其他任务,其他任务去用这个指针读取值,最后释放掉指针。多任务同时访问全局变量,必须要加锁或者使用信号量让多任务不能同时操作全局变量