使用C语言同时运行pic16f877a的多个功能



我使用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

是否有可能用微c来做这个pic,我怎么能同时调用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信息,假设您只想设置一些数字输出。

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

尽管freeRTOS可以"免费"获取并用于个人项目,但我建议您购买一本他们的书来帮助实现。他们的网站上有免费的API和演示代码。有了这本书就更容易理解了(请注意,我并不依赖于freeRTOS,我在atmel控制器的项目中使用过它,发现它非常容易使用)

与freeRTOS你创建一个任务(你定义你的螺线管控制功能),然后你设置优先级,延迟,然后启动内核。这其实很简单。

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

最新更新