0

我正在使用 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 个或多个函数同时启动?

4

2 回答 2

1

pic16 系列没有任何解决方案(它太小了),但是有专门为微控制器制造的 FreeRtos,并且有一个用于 PIC18(和其他一些)的端口查看支持的设备列表

尽管 freeRTOS 可以“免费”获得并在个人项目中使用,但我建议您购买他们的一本书来帮助实施。他们的网站上有免费的 API和演示代码。用这本书会更容易理解(请注意,无论如何我都没有绑定到 freeRTOS,我在带有 atmel 控制器的项目中使用它,发现它非常易于使用)

使用freeRTOS,您可以创建一个任务(定义您的螺线管控制功能),然后设置优先级、延迟,然后启动内核。这实际上非常简单。

同样,这不适用于您的特定芯片 pic16,但如果您可以尝试另一个,freeRTOS 是一个非常知名且非常简单的解决方案

于 2015-07-24T19:57:12.380 回答
1

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

考虑这个草图:

// 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

于 2015-07-19T13:00:04.123 回答