使用C,使用pic16f877a同时运行多个功能

时间:2015-07-19 12:42:00

标签: c multithreading pic robotics microc

我正在使用microC编程pic16f877a来操作电机和螺线管。 我有一些功能使电机在不同的时空移动,例如motor1移动100ms,停止,再移动100ms等4个循环,motor2移动200ms,依此类推。我希望这些功能同时启动。

想想一个机器人,当你想要每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为此pic执行此操作,如何调用2个或更多函数同时启动?

2 个答案:

答案 0 :(得分: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信息。

答案 1 :(得分:1)

pic16系列没有任何解决方案(它太小了)但是有FreeRtos专门针对微控制器而且有一个PIC18端口(以及其他一些)查看supported device list

尽管freeRTOS“免费”获取并在个人项目中使用,但我建议您购买其中一本书以帮助实施。还有免费的API on their site和演示代码。用书来理解它会更容易(请注意我无论如何都不依赖于freeRTOS,我在使用atmel控制器的项目中使用它并发现它很容易使用)

使用freeRTOS你创建一个任务(你定义你的电磁阀控制功能)然后你设置优先级,延迟然后启动内核。这实际上非常简单。

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