首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++在pic16f877a中同时运行多个函数

使用C++在pic16f877a中同时运行多个函数
EN

Stack Overflow用户
提问于 2015-07-19 20:42:00
回答 2查看 342关注 0票数 0

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

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

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

代码语言:javascript
复制
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可以做到这一点吗?我如何调用2个或更多函数来同时启动?

EN

回答 2

Stack Overflow用户

发布于 2015-07-19 21:00:04

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

考虑这个草图:

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2015-07-25 03:57:12

pic16系列没有任何解决方案(它太小了),但有专门为微控制器设计的FreeRtos,还有一个用于PIC18 (和其他几个)的端口。请查看supported device list

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31501327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档