c - 使用 C 使用 pic16f877a 同时运行多个函数

标签 c multithreading pic robotics microc

我正在使用 microC 对 pic16f877a 进行编程以操作电机和螺线管。 我有一些功能可以让电机在不同的时空移动,例如电机 1 移动 100 毫秒,停止,再次移动 100 毫秒等,循环 4 次,电机 2 移动 200 毫秒,依此类推。我希望这些功能同时启动。

想想一个机器人,当你想要每 200 毫秒上下移动它的右手总共 2 分钟,而它的左手每 400 毫秒上下移动一次总共 2 分钟。这个过程应该同时开始。

所以基本上我想开始这样的事情:

start:
solenoid1 runs functionQuarter(moves up-down every x time) total like 2 mins
solenoid2 runs functionHalf(moves up-down every 2x time) total like 2 mins
stop

是否可以使用 micro c 为这张照片执行此操作,我如何调用 2 个或更多函数同时启动?

最佳答案

为什么你认为你需要线程?你确切地知道什么时候应该发生一个操作,所以在那个时候执行那个操作。您所需要的只是一个合适的调度系统,可以帮助您跟踪操作。与线程相比,你没有意外调度的问题,可能延迟更低,不需要线程间同步。

考虑这个草图:

// this task structure says at what time to set 
// an output to a certain value
struct task {
    time_type when;
    output_type output;
    value_type value;
};

struct task_queue {
    struct task** tasks;
    size_t count;
};
void task_queue_push(struct task_queue* q, struct task* t);
struct task* task_queue_front(struct task_queue* q);
struct task* task_queue_pop(struct task_queue* q);

现在,在一个循环中,您会一直查看队列中的第一个元素,然后一直查看 sleep() 直到下一个任务开始。当然,这意味着您需要按开始时间对这些任务进行排序!如果多个任务同时启动,则需要同时运行它们,唯一的限制是“同时”执行每个任务的时间。如有必要,作为处理一项任务的一部分,您可以创建一项或多项其他任务。作为一种变体,您还可以使用回调,而不只是假设您只想设置一些数字输出的 outputvalue 信息。

关于c - 使用 C 使用 pic16f877a 同时运行多个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31501327/

相关文章:

c - 如何衡量我的代码质量?

c - 为什么 BLAS dsyrk 比简单的 C 实现更精确?

c++ - 写入多个文件描述符

c++ - 使用 cppUnit 的开源项目?

linux - 在来自两个不同进程的相同文件描述符上调用 ioctl

wpf - WPF:UI线程被阻止时更新鼠标指针

multithreading - 应用程序需要很长时间才能同步线程(或根本不同步)

c - 将代码从 PIC18F2480 迁移到 PIC18F2680 单片机

c - 在PIC16F723上设置定时器

CCS,3 秒定时器