OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3920|回复: 8

usmart指针相关

[复制链接]

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
发表于 2016-3-2 10:37:45 | 显示全部楼层 |阅读模式
1金钱
1.struct _m_usmart_nametab
{
        void* func;                        //函数指针
        const u8* name;                //函数名(查找串)         
};
这里的void* func应该是指针函数吧?它是一个函数,函数返回值是void*类型的。函数指针和指针函数不一样。
2.void TIM4_IRQHandler(void)
{                                                                   
        if(TIM_GetITStatus(TIM4,TIM_IT_Update)==SET)//溢出中断
        {
                usmart_dev.scan();        //执行usmart扫描       
                TIM_SetCounter(TIM4,0);                //清空定时器的CNT
                TIM_SetAutoreload(TIM4,100);//恢复原来的设置                                                                                                               
        }                                  
        TIM_ClearITPendingBit(TIM4,TIM_IT_Update);  //清除中断标志位   
}
没理解测函数执行的时间,TIM_SetCounter(TIM4,0);//清空定时器的CNT            TIM_SetAutoreload(TIM4,100);//恢复原来的设置,这里arr设为100,不是0xFFFF是什么意思?

最佳答案

查看完整内容[请看2#楼]

1.在usmart_exe()函数里有res=(*(u32(*)())usmart_dev.funs.func)()类似这样的语句,就把指针变量强制转换为函数指针了。 2.函数执行时间计算还是在usmart_exe()里进行的,先后调用usmart_reset_runtime()和usmart_get_runtime()这两个完成的,好好看下应该能看明白的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-1-27
在线时间
64 小时
发表于 2016-3-2 10:37:46 | 显示全部楼层
1.在usmart_exe()函数里有res=(*(u32(*)())usmart_dev.funs[id].func)()类似这样的语句,就把指针变量强制转换为函数指针了。
2.函数执行时间计算还是在usmart_exe()里进行的,先后调用usmart_reset_runtime()usmart_get_runtime()这两个完成的,好好看下应该能看明白的。
回复

使用道具 举报

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
 楼主| 发表于 2016-3-2 14:47:46 | 显示全部楼层
seabird624 发表于 2016-3-2 13:23
1.在usmart_exe()函数里有res=(*(u32(*)())usmart_dev.funs.func)()类似这样的语句,就把指针变量强制转换 ...

1.就是说原子哥这里应该标识为指针函数,然后再转化为函数指针
2.usmart_get_runtime,获取函数运行时间,通过读取CNT值获取,由于usmart是通过中断调用的函数,所以定时器中断不再有效,此时最大限度只能统计2次CNT的值,也就是清零后+溢出一次,当溢出超过2次,没法处理,所以最大延时,控制在:2*计数器CNT*0.1ms.对STM32来说,是:13.1s左右
这句话理解不了
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-1-27
在线时间
64 小时
发表于 2016-3-2 15:46:37 | 显示全部楼层
2.①在usmart_reset_runtime()这个没有调用之前,TIM4中断时间是100ms
   ②在调用usmart_reset_runtime()之后,TIM4中断时间就变成了0xffff*0.1ms=6.5536s
   ③然后执行函数,如果执行时间超过6.5536s时,就会发生一次TIM4中断,但是因为是同一中断,优先级相同,所以6.5536s那次中断没有执行
  ④因为TIM_FLAG_Update这个标记位在6.5536s置1后就没有清零,所以就只能是6.5536+6.5536
不知道这样看懂了没。。。

回复

使用道具 举报

19

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
178
金钱
178
注册时间
2015-7-26
在线时间
28 小时
 楼主| 发表于 2016-3-2 16:59:13 | 显示全部楼层
seabird624 发表于 2016-3-2 15:46
2.①在usmart_reset_runtime()这个没有调用之前,TIM4中断时间是100ms
   ②在调用usmart_reset_runtime() ...

TIM_SetAutoreload(TIM4,100);//恢复原来的设置      这里的100是不是改为1000
回复

使用道具 举报

0

主题

15

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
226
金钱
226
注册时间
2016-1-27
在线时间
64 小时
发表于 2016-3-2 19:43:56 | 显示全部楼层
huajia 发表于 2016-3-2 16:59
TIM_SetAutoreload(TIM4,100);//恢复原来的设置      这里的100是不是改为1000

恩,是1000,我也不知道为什么这么处理
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2016-3-2 22:50:49 | 显示全部楼层
[mw_shl_code=c,true]//下面这两个函数,非USMART函数,放到这里,仅仅方便移植.
//定时器4中断服务程序         
void TIM4_IRQHandler(void)
{                                                                   
        if(TIM4->SR&0X0001)//溢出中断
        {
                usmart_dev.scan();        //执行usmart扫描       
                TIM4->CNT=0;                //清空定时器的CNT
                TIM4->ARR=1000;                //恢复原来的设置                                                                                                               
        }                                  
        TIM4->SR&=~(1<<0);//清除中断标志位             
}[/mw_shl_code]
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2016-1-4
在线时间
31 小时
发表于 2016-3-4 10:29:49 | 显示全部楼层
我也刚学习到这个实验了,函数指针用的太棒了。大开眼界。我的库函数代码里发现
u8 usmart_search_nextc(u8* str)
{                                   
        str++;
        while(*str==' '&&str!='\0')str++;
        return *str;
}
个人觉得while(*str==' '&&str!='\0')str++;这个判断是不是应该改为while(*str==' '&& *str!='\0')str++;
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2016-7-29
在线时间
66 小时
发表于 前天 16:56 | 显示全部楼层
lyconly1 发表于 2016-3-4 10:29
我也刚学习到这个实验了,函数指针用的太棒了。大开眼界。我的库函数代码里发现
u8 usmart_search_nextc(u ...

这个str!='\0',用于判断当前指针变量是否为空指针
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表