• SOEM 源码解析 ecx_config_find_mappings


    1. /* Find mappings and program syncmanagers
    2. * 查找映射和设置同步管理器
    3. * @param[in] context = context struct
    4. * 上下文结构体
    5. * @param[in] group = group to map, 0 = all groups
    6. * 要映射的组,0=所有组
    7. */
    8. static void ecx_config_find_mappings(ecx_contextt *context, uint8 group)
    9. {
    10. int
    11. thrn, /* 调用线程索引 */
    12. thrc;/* 线程计数 */
    13. uint16 slave;/* 从站编号 */
    14. for (thrn/* 调用线程索引 */ = 0;
    15. thrn/* 调用线程索引 */ < EC_MAX_MAPT;/* 定义映射中的最大并发线程数 */
    16. thrn++/* 调用线程索引 */)
    17. {
    18. ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */].running/* 运行 */ = 0;
    19. }
    20. /* find CoE and SoE mapping of slaves in multiple threads *//* 查找多个线程中从站的 CoE 和 SoE 映射 */
    21. for (slave /* 从站编号 */ = 1;
    22. slave/* 从站编号 */ <= *(context->slavecount);/* 从站数量[从站个数] */
    23. slave++/* 从站编号 */)
    24. {
    25. if (!group/* 要映射的组,0 = 所有组 */||
    26. (group/* 要映射的组,0 = 所有组 */ ==
    27. context->slavelist/* 从站列表 */[slave/* 从站编号 */].group/* 组(group) */))
    28. {
    29. #if EC_MAX_MAPT/* 定义映射中的最大并发线程数 */ > 1
    30. /* multi-threaded version *//* 多线程版本 */
    31. while ((thrn/* 调用线程索引 */
    32. = ecx_find_mapt(/*多线程版本下查找调用线程索引*/)) < 0)
    33. {
    34. /* 睡眠函数,休眠到要求的时间(指定的延迟时间[单位:usec]) */
    35. osal_usleep(1000);
    36. }
    37. ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */].context /* 上下文结构体 */
    38. = context;/* 上下文结构体 */
    39. ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */].slave/* 从站编号 */
    40. = slave;/* 从站编号 */
    41. ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */].thread_n /* 调用线程索引 */
    42. = thrn;/* 调用线程索引 */
    43. ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */].running/* 运行 */ = 1;
    44. osal_thread_create(/* 创建线程 *//* create thread */
    45. &(ecx_threadh[thrn/* 调用线程索引 */]),
    46. 128000, /* stacksize 线程堆栈大小[单位:字节数] */
    47. &ecx_mapper_thread,// 多线程版本 查找从站映射
    48. &(ecx_mapt/* 多线程映射结构体列表 */[thrn/* 调用线程索引 */]));
    49. #else
    50. /* serialised version *//* 序列化版本 */
    51. ecx_map_coe_soe(// 在多线程中查找slave的CoE和SoE映射
    52. context,/* 上下文结构体 */
    53. slave,/* 从站编号 */
    54. 0);/* 调用线程索引 */
    55. #endif
    56. }
    57. }
    58. /* wait for all threads to finish *//* 等待所有线程结束 */
    59. do
    60. {
    61. thrc/* 线程计数 */
    62. = ecx_get_threadcount(/* 获取运行中的线程计数 */);
    63. if (thrc/* 线程计数 */)
    64. {
    65. /* 睡眠函数,休眠到要求的时间(指定的延迟时间[单位:usec]) */
    66. osal_usleep(1000);
    67. }
    68. } while (thrc/* 线程计数 */);
    69. /* find SII mapping of slave and program SM */
    70. /* 查找从站的 SII 映射和设置 SM */
    71. for (slave /* 从站编号 */ = 1;
    72. slave/* 从站编号 */ <= *(context->slavecount);/* 从站数量[从站个数] */
    73. slave++/* 从站编号 */)
    74. {
    75. if (!group/* 要映射的组,0 = 所有组 */ ||
    76. (group/* 要映射的组,0 = 所有组 */ ==
    77. context->slavelist/* 从站列表 */[slave/* 从站编号 */].group/* 组(group) */))
    78. {
    79. ecx_map_sii(// 查找从站的 SII 映射
    80. context,/* 上下文结构体 */
    81. slave);/* 从站编号 */
    82. ecx_map_sm(// 查找从站的 SII 映射和设置 SM
    83. context, /* 上下文结构体 */
    84. slave);/* 从站编号 */
    85. }
    86. }
    87. }

  • 相关阅读:
    常用电子元器件基础知识
    perflab 课程设计
    v-decorator和v-model的使用对比
    Vis.js教程(一):基础教程
    计算机毕业设计(附源码)python中小学在线作业管理小程序
    手把手教你解决ClassCastException类型转换异常
    接口自动化测试 —— 工具、请求与响应
    浅尝Spring注解开发_Bean生命周期及执行过程
    万字长文解读计算机视觉中的注意力机制(附论文和代码链接)
    imx6ull pro BSP 工具链
  • 原文地址:https://blog.csdn.net/qq_25047389/article/details/127697105