https://groups.google.com/forum/#!searchin/beagleboard/$20Clear$20CPU$20caches/beagleboard/ypXbgkmkAek/GaCqAyAWREkJ
2014-05-18 0:32 GMT+08:00 <fis.ir...@gmail.com>: > Hi, > > I am using TI AM335x BeagleBone, Linux kernel version 3.8.13. My aim is to > get fast and reliable time values from user-space using dmtimer. > > When I I read (and print) tick values of DMTimer2 though /dev/mem, I have > the following: > > 3146348594 > 3146350438 > 3146352109 > 3146357959 > 3146360117 > 3146361773 > 3146363376 > 3146364986 > 3146370527 > 3146374221 > 3146376003 > 3146382901 > 3146384741 > 3146386379 > > However, when I invoke device driver with mmap operation and then in user > space interact with this device, I have a strange behavior. Ticks are > repeated periodically: > > 2296380051 > 2296386006 > 2296386006 > 2296403883 > 2296412958 > 2296423574 > 2296423574 > 2296438010 > 2296438010 > 2296438010 > 2296457840 > 2296468548 > 2296468548 > 2296482669 > 2296482669 > 2296482669 > 2296482669 > 2296507701 > > I am not sure, but it looks like L1/L2 caches are overflowed. My question > is what can cause this behaviour. And if it is CPU caches, how they can be > cleared. > I found this answer How to clear CPU L1 and L2 > cache<http://stackoverflow.com/questions/3446138/how-to-clear-cpu-l1-and-l2-cache>, > but I doubt how I can apply this method. > Do you have any suggestions? I will appreciate any help. > > > If it is necessary, I post here briefly the way how I obtain these ticks > vs driver. > > 1. remapping of a specific region in kernel space (0x48040000 - DMTIMER2 > register start address): > > static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma) > { > unsigned long off = vma->vm_pgoff << PAGE_SHIFT; > // generate the correct page frame number > unsigned long pfn = (0x48040000 + off) >> PAGE_SHIFT; > > // vsize is the requested size of virtual memory > unsigned long vsize = vma->vm_end - vma->vm_start; > > // psize is the physical I/O size that is left after the offset has been > specified > unsigned long psize = 0x48040000 + 32 - off; > > // refuses to map addresses that extend beyond the allowed memory range > if (vsize > psize) > { > return -EINVAL; > } > if (remap_pfn_range(vma, vma->vm_start, pfn, vsize, vma->vm_page_prot)) > { > return -EAGAIN; > } > vma->vm_ops = &simple_remap_vm_ops; > simple_vma_open(vma); > return 0; > } > > > 1. in user space I do it approximately in the following way: > > . > > volatile unsigned char* dmt2_regs; > dmt2_regs = (unsigned char*) mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, > MAP_SHARED, fd, 0); > while (true) > { > uint32_t t0 = * (uint32_t*) ( dmt2_regs + 0x3c ); > std::cout << t0 << std::endl; > } > > -- > For more options, visit http://beagleboard.org/discuss > --- > You received this message because you are subscribed to the Google Groups > "BeagleBoard" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to beagleboard+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- For more options, visit http://beagleboard.org/discuss --- You received this message because you are subscribed to the Google Groups "BeagleBoard" group. To unsubscribe from this group and stop receiving emails from it, send an email to beagleboard+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.