如何解决这种问题
在相机的发送模块添加以下代码:
if (选择发送){if(选择微信发送){获取发送人;选择发送人;}else if(选择qq发送){获取发送人;选择发送人;}else if(选择微博发送){获取发送人;选择发送人;}..此处省略一万行.}
我目前这样理解的,相机要发送图片,面临着多种发送方式,每一种发送方式肯定会调用不同的函数。反过来想,就是我有很多的应用,要使用相机这个模块(此处对比定时器)。既然这样,相机模块定义一个注册函数,供其他模块调用,以告诉相机,允许使用对应的发送方式。
#define num_max 20 //最大设备数typedef struct{u8 num;//当前注册设备数u8 list_ name[num _max]; //用于保存注册设备列表void (*click[num _max])(u8 * temp); //存放不同模块(微信qq)的发送函数地址}Equiment;Equiment COM;/**************************注册函数****************************************/void Photo_Register ( void(*a)(u8 * temp),u8 list ) //提供给外部的接口{if(COM.num < num.max){COM. click[COM. num]=a; //保存函数地址COM. List _name [ COM. num ]=list; //保存设备名至列表COM. num++;}else{/****超过最大设备数报错******/}}/*相机中的发送函数*/void Click(u8 temp) // 最终实现图片发送调用此函数即可{u8 i,NUM;for(i=0; i<= COM.num ; i++){printf(“打印列表,显示已经注册的设备”)}NUM =Get(选择的发送方式);if(!NUM)COM.click[NUM](temp);}/*******************以上在相机中实现************************************/
定时器运用注册机制
time.h :
#include "stm32f10x.h"#ifndef __TIME_H#define __TIME_H#define TimerID_max 20 //最大注册设备数#define RunOutOf_time(ID , ms) ( systime.no w-systime.last[ID -1]< ms )typedef struct{u8 ID; //设备IDu32 now; //当前时间u32 last[TimerID_max]; //存放抓取到的时间void (*timer_init)(u16 countdata,u16 freqData); //指向初始化函数u8 (*get_id)(void); //指向获取ID函数void (*refresh)(u8 ID); //指向更新时间函数}SYSTIME;extern SYSTIME systime;#endiftime.c#include "time.h"/*********提供给外部的API*******************/void Timer_Init(u16 CountData,u16 FreqData);unsigned char systime_get(void);void Refresh(u8 ID);/***********************************************/SYSTIME systime = 定义SYSTIME类型变量,并初始化函数指针{.get_id=systime_get,.refresh=Refresh,.timer_init=Timer_Init};/****************************************************///函数名:Timer_init//描述:初始化定时器//输入:中断时间相关//输出:null/****************************************************/void Timer_Init(u16 CountData,u16 FreqData){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);NVIC_InitTypeDef NVIC_InitStructure;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_DeInit(TIM4);TIM_TimeBaseStructure.TIM_Prescaler = FreqData;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM4, TIM_FLAG_Update);TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);TIM_Cmd(TIM4, ENABLE);}/****************************************************///函数名:systime_get//描述:获取当前时间,并产生一个注册//输入:null//输出:null/****************************************************/unsigned char systime_get(){if(systime.ID<TimerID_max){systime.last[systime.ID]=systime.now;systime.ID++;return systime.ID;}elsereturn 0;}/****************************************************///函数名:Refresh//描述:更新当前时间//输入:获取到的ID//输出:null/****************************************************/void Refresh(u8 ID){systime.last[ID-1]=systime.now;}/****************************************************///函数名:TIM4_IRQHandler//描述:1ms定时器//输入:null//输出:null/****************************************************/void TIM4_IRQHandler(void){if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM4, TIM_IT_Update);systime.now++;}}
在.c与.h实现了以上后,面向外部的只有三个函数:
/*********提供给外部的API*******************/void Timer_Init(u16 CountData,u16 FreqData);unsigned char systime_get(void);void Refresh(u8 ID);/***********************************************/
定时器的使用方法
1
2 /*初始化*/
/**********任务1实现运行等闪烁,频率1s **********/void task1(){static u8 Task1_ID;if(!Task1_ID)Task1_ID=systime.get_id();if(RunOutOf_time(Task1_ID,1000))RUN_LED()=1;else if(RunOutOf_time(Task1_ID,2000))RUN_LED()=0;else if(RunOutOf_time(Task1_ID,3000))RUN_LED()=1;else if(RunOutOf_time(Task1_ID,4000))RUN_LED()=0;else if(RunOutOf_time(Task1_ID,5000)RUN_LED()=1;elsesystime.refresh(Task1_ID);}/*******************任务2实现运行等闪烁,频率100ms**********************/void task2(){static u8 Task1_ID;if(!Task1_ID)Task1_ID=systime.get_id();if(RunOutOf_time(Task1_ID,100))RUN_LED()=1;else if(RunOutOf_time(Task1_ID,200))RUN_LED()=0;else if(RunOutOf_time(Task1_ID,300))RUN_LED()=1;else if(RunOutOf_time(Task1_ID,400))RUN_LED()=0;else if(RunOutOf_time(Task1_ID,500))RUN_LED()=1;elsesystime.refresh(Task1_ID);}/***************main函数实现任务1运行10s,任务2运行10s****************/int main(void){static u8 main_ID;System_Init();while(1){if(!main_ID)main_ID=systime.get_id();if(RunOutOf_time(main_ID,10000))task1();else if(RunOutOf_time(main_ID,20000))task2();elsesystime.refresh(main_ID);}}
夜雨聆风