OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5309|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
, i" Z. ?: j: O1 e/ a6 o- g* Q, n1 e( D' ~1 c' s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; Y8 l6 F( S1 S$ Z4 I' C: a+ y4 G
#include <unistd.h>& U# C& h4 _3 w# Z& q' ~
#include <sys/mman.h>
8 [/ w& D+ o4 g# J) ^# C#include <sys/types.h>
* {4 m7 e0 |* i#include <fcntl.h>6 g; F( |9 l& D+ `8 Z$ @% I
: @  h- Y' Y# \8 a" |& |; c4 j
#define SHAER_RAM_BASE_ADDR    (0x80000000)   7 X; |' @4 j1 U) H

- R$ ~, J/ n& g7 d! {, mtypedef struct
2 k2 [& D( \$ {9 `( M: ]$ w) q{
1 ^& a) Y) e) h" ?1 f/ X        unsigned int a;
0 q0 N& S" B6 b" Z! l2 t1 d        unsigned int b;; h, N  C  O0 T
        unsigned int packet_cout;: N( c' f. m3 ~, I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) B' }( G+ s/ q) F4 ]

# D* T( \$ `* `. W0 [void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
: S" Q* @; W( L% _! eunsigned int count_copy = 0;+ B' Q; k* K/ M' h; @7 ]

. p1 ^. I& C* x( E* g, Y. M8 j/ v! z# e. d2 g
int main()
' ]% ^) k( _& E5 o9 h6 \{
& E: A! v3 u2 J7 R! G        pRX_MSG_PROTOCOL pshreRAM = NULL;
% ]1 {: t3 H5 r, D; c$ b  ]        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; C% [5 G: w. z" m7 V
" ?' R( w3 R3 B" w" F6 b* Q
        while(1)
. s; }" Y# A5 ]4 r        {
6 j# \& F5 T. ~# @+ N                read_MSG_buffer(pshreRAM);
* ~/ h; a+ U0 q# Q# h2 O        }               
2 G' V7 n5 L5 @9 m}& |* S0 z/ X) r( B
" b$ h. W! k3 _/ s* J: C9 y2 ~6 l- i- W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! b! l" E) s% K" W; s{
& O* M% F' V4 v- t        RX_MSG_PROTOCOL buf;
5 F5 ]/ r  ~' A        
4 ?- S5 L7 O0 L: p        buf.a = pshreRAM->a;& ?* l$ S# L2 S8 z* ]7 O0 L
        buf.b = pshreRAM->b;, {7 J7 ]9 s; n8 L: u+ g
        buf.packet_cout = pshreRAM->packet_cout;
& X4 A! y5 E. u, L7 q        
+ A# L5 @% T1 h/ M2 n. I9 G        if(buf.packet_cout != count_copy)2 f3 `3 E& Y5 l* l
        {5 q* X* |) B. H% @# r1 L! t
                printf("a is %d\n", buf.a);
$ r8 T6 s( b2 `  d9 g- \2 {                printf("b is %d\n", buf.b);
5 m6 L' e* ?; |7 O- O3 A* E* Y  ?  ?                printf("count is %d\n", buf.packet_cout);0 w- Z6 b8 G5 a( O2 V2 V4 b: V
                count_copy = buf.packet_cout;
. I3 I* @% A1 H2 Z        }
& d, ]% {7 J1 Q$ d* L; D! [        else
& B7 F' u% P- X, }: C3 D( @* x        {- S1 e: s4 A- l; b9 b0 I) u
                printf("No effective message!");
5 X) |8 B7 l' v) {' ~# m        }& P  ]9 z; d) w; c* E- t9 ]  ^
}! R: u, b+ o4 c  z( X
* R. q! ^6 m. k2 R) {  ]! [" P

/ z1 p5 f+ N% j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 T6 p% [) z; Y, l. m使用下面代码,对内存使用了mmap函数后:
8 e  ?! {% [3 r+ ?, Q#include <stdio.h>/ s' b- G0 |, F8 x
#include <unistd.h>
$ C1 g- ?1 c0 m* x7 D; J#include <sys/mman.h>4 O& f0 i" F) A3 v
#include <sys/types.h>& y6 k6 O0 i) f: u
#include <fcntl.h>% Z( u8 a% F- E

* Y! f* ?3 [3 a- e% ]#define SHAER_RAM_BASE_ADDR    (0x80000000)
: F. N# ~. _. M! L#define SHAER_RAM_SIZE         (0x20000)   & Z0 ?1 g! n" w$ n' U

/ B5 i5 a. H. b' ~* j3 jtypedef struct% o  F2 B( y$ b0 y- F: P4 X
{# r4 F& n  e+ {, n7 {/ ?% u
        unsigned int a;% g* B- {+ F8 _: J
        unsigned int b;
- h& u' G9 U1 C" B, G6 T2 ~9 b        unsigned int packet_cout;% C; b5 L' m: l4 ~5 i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
6 ]7 Q/ t* t5 l6 J0 q: L0 S
  q/ e& n$ K. F8 t- Jvoid read_MSG_buffer(int *baseaddr);& g1 D4 M: q! v# W% X, [( o! D
unsigned int count_copy = 0;
/ l  Q% R1 x2 |9 L6 ^1 }7 D' |0 E0 Y7 v" P
int main()
( Q$ D/ O; F' E& I9 H; ]/ Z{/ R7 ]8 J- d7 b2 D  i
        int fd;$ @/ n  r" A4 ?0 Y% z. `% v, L7 ]
        int *mem = NULL;
1 Q, ^# Y& a% ^/ M0 F8 y+ O' e/ ]) A( B% W
        if((fd = open("/dev/mem", O_RDWR)) <0): d( K/ H! W( w/ s: F
        {7 `1 b9 s% j# ^6 f
                perror("open error");' y2 z1 _% u) [' z9 M9 V- o
                return -1;
. j/ \; p9 R/ y8 p9 [- z7 q        }
% {8 ~- N/ N0 j        : m0 N7 U3 R1 j# s3 P2 E4 N) k: [
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);" M$ [# C5 ~! z$ i/ B: |

5 B+ `# D  M9 c6 i0 r        while(1)
" R) `' j. |6 T$ w: X        {
7 S( F6 F0 o- Z                read_MSG_buffer(mem);6 b8 z. b. h* p9 l) r- J
        }               
6 `1 b. [5 G* a& D: [; Z! |}
& G& F) H8 d5 h" J6 i% \1 C, y" E1 q' m# ]5 P$ C) o1 R0 z( l! l" q
void read_MSG_buffer(int *baseaddr)  q5 e* p; A, D! J
{
- v$ H0 ^2 I8 o$ H! t7 \  b  S& ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
: A/ i2 T. n3 k2 s6 \4 S% `( v
) V: A4 e5 o. n        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 A! S, [  t+ U# s, {! X- }# L' |4 \+ m
        if(pshreRAM->packet_cout != count_copy)
: y& O% n1 s+ V$ i3 J) V7 ?        {/ n/ N( N  D& [2 b2 x/ W; ~  d
                printf("a is %d\n", pshreRAM->a);) a# |1 r2 ^0 h" P5 M
                printf("b is %d\n", pshreRAM->b);
# h1 a/ }) g, V$ l) c; e                printf("count is %d\n", pshreRAM->packet_cout);1 |! ]9 ~( ^% \/ u/ ^  D) D& w  I
                count_copy = pshreRAM->packet_cout;! J' W0 }, z& }: I$ v8 n  [6 v
        }
- W) }! [( M9 Q: j, Y# H# U; N        else
3 ?8 H; R6 Q$ u! z. T* q* W3 Y        {- _) W7 J* R1 b1 m) ]7 J/ c
                printf("No effective message!\n");
, s2 _8 A1 J0 t        }
1 R5 T: T1 a& Y/ T# `% f}% \9 f9 ~$ ?: @& z; e& |
  Q  Z" ?8 ?: C
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- R: E3 F* O$ S( a
3 g; u: O9 z0 q6 [- ]. W0 u0 n" g) H# z$ z

. X- e: U5 G: r+ g6 Y) X5 f9 @5 A* m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-14 15:47 , Processed in 0.042299 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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