test_multithread.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <stdio.h>
  2. #include <pthread.h>
  3. #include <stdlib.h>
  4. #include "pcilib.h"
  5. #include "pcilib/error.h"
  6. const char* prop = "/registers/fpga/reg1";
  7. char* reg;
  8. int stop = 0;
  9. /*
  10. void *get_prop(void *arg)
  11. {
  12. pcilib_t *ctx = (pcilib_t*)arg;
  13. while(!stop)
  14. {
  15. int err;
  16. pcilib_value_t val = {0};
  17. err = pcilib_get_property(ctx, prop, &val);
  18. if(err)
  19. {
  20. pcilib_error("Error in pcilib_read_register");
  21. return NULL;
  22. }
  23. long value = pcilib_get_value_as_int(ctx, &val, &err);
  24. pcilib_clean_value(ctx, &val);
  25. if(err)
  26. {
  27. pcilib_error("Error in pcilib_get_value_as_int");
  28. return NULL;
  29. }
  30. printf("reg = %li\n", value);
  31. }
  32. return NULL;
  33. }
  34. */
  35. void *read_reg(void *arg)
  36. {
  37. pcilib_t *ctx = (pcilib_t*)arg;
  38. while(!stop)
  39. {
  40. int err;
  41. pcilib_register_value_t reg_val = {0};
  42. pcilib_value_t val = {0};
  43. err = pcilib_read_register(ctx, NULL, reg, &reg_val);
  44. if(err)
  45. {
  46. pcilib_error("Error in pcilib_read_register");
  47. return NULL;
  48. }
  49. err = pcilib_set_value_from_register_value(ctx, &val, reg_val);
  50. if(err)
  51. {
  52. pcilib_error("Error in pcilib_set_value_from_register_value");
  53. return NULL;
  54. }
  55. long value = pcilib_get_value_as_int(ctx, &val, &err);
  56. pcilib_clean_value(ctx, &val);
  57. if(err)
  58. {
  59. pcilib_error("Error in pcilib_get_value_as_int");
  60. return NULL;
  61. }
  62. printf("reg = %li\n", value);
  63. }
  64. return NULL;
  65. }
  66. int main(int argc, char *argv[])
  67. {
  68. if (argc < 5) {
  69. printf("Usage:\n\t\t%s <device> <model> <register> <num_threads>\n", argv[0]);
  70. exit(0);
  71. }
  72. reg = argv[3];
  73. int threads = atoi( argv[4] );
  74. pcilib_t *ctx = pcilib_open(argv[1], argv[2]);
  75. for(int i = 0; i < threads; i++)
  76. {
  77. pthread_t pth;
  78. pthread_create(&pth, NULL, read_reg, ctx);
  79. }
  80. getchar();
  81. stop = 1;
  82. return 0;
  83. }