OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 % X5 o1 s8 k( P! z# T& M. h

1 w3 G, V- d& TOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
9 ^: l, V9 D7 p#include <unistd.h>: g+ x& H) S8 Q# s
#include <sys/mman.h>
% R$ A4 ]1 M  u  c3 q$ s& o#include <sys/types.h>
. l3 D1 T! N: |3 L#include <fcntl.h>
% F  E7 g7 k4 S$ g* L" \9 c0 D( ?7 n3 Y$ n
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 c( I) y) O% m+ W: Y$ W! R) `  f
* {4 L# e+ _" T/ Ytypedef struct
/ U6 @/ |6 y& R+ A8 a5 g{0 a! |9 a$ ~2 S4 X
        unsigned int a;7 N! o# R2 z' |: H3 N  A
        unsigned int b;
4 P7 ^& }7 S" a" x# S( |6 \        unsigned int packet_cout;
8 A$ ~" ~2 u8 y9 R}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% |% E. o0 d4 [7 @  t% _2 H
/ q9 R8 H* C9 d0 }* N: ^4 ~; c( fvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);' e# ?! o  e/ @: \, R
unsigned int count_copy = 0;8 _" I6 Z4 B5 _) }) s8 G3 U

7 ^. P( I8 C9 q) |5 B6 p" S8 F1 e3 @3 Q
int main()) `6 u1 j" H2 {% ]$ \! ^/ E/ {+ l
{" u5 @1 X& H- |. L. j; ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
8 O/ L- Z! t4 a. C% z5 G        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! [- H" d7 i: O& R& {9 w" r" j# c2 \1 k: M9 {) N' \
        while(1)
) S0 L$ t* r( R# V! z        {
4 L. v3 i6 i* n3 m: x/ W$ X3 Q                read_MSG_buffer(pshreRAM);: ^8 Q0 k. Y# \" D) d1 G4 P
        }               
6 y& l( s- P! e; c9 ^, M}
( o3 r6 u/ O- S* |( j* B; ^8 A: z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" n8 ~( c% k- R% k' k4 [( `- K  a& o
{$ r3 w$ {' b* ~& N/ k+ c( \
        RX_MSG_PROTOCOL buf;
5 j2 c) x( z( t# e        
. n3 V, G' x9 s( }) g" b6 k        buf.a = pshreRAM->a;9 ]( Q" e+ |, m) L% t: B
        buf.b = pshreRAM->b;
) Y! b+ n& D3 l2 \        buf.packet_cout = pshreRAM->packet_cout;6 `# \* U0 C$ P  p9 X) j: C! s
        # Q6 l! h3 L" B3 @
        if(buf.packet_cout != count_copy)+ x( L* o( q5 _7 c
        {
% V9 D! ?1 q" V, M: M2 t+ J                printf("a is %d\n", buf.a);
7 I' I0 m3 @  n) `# m: x                printf("b is %d\n", buf.b);4 |& g7 [2 W3 A$ u
                printf("count is %d\n", buf.packet_cout);
8 P3 ]# W: ?: L/ J2 w8 x1 Y/ P5 T: k                count_copy = buf.packet_cout;
5 r* T) h4 I; L% `  G        }
, h/ q# j$ a7 ~6 F( r        else
9 d( Y9 z3 [, ~        {3 ?+ k. c( |0 w5 R
                printf("No effective message!");
+ }( O# b. T$ T- x8 `        }
. ?# G! ?9 R! I( [3 Y; o+ S}
# v/ c; h: I! v* E6 P6 m( H: W. c# k5 g& B

4 x) N% u; t4 Z* ?- j但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。. {& a8 a& D8 F$ \4 @0 q' ~( N6 v
使用下面代码,对内存使用了mmap函数后:
" _. ]" z+ Y# @% T$ D  v; s! d#include <stdio.h>; L3 L6 [) S/ W. u( v
#include <unistd.h>8 P- H% X! L7 b- z' e/ N! M
#include <sys/mman.h>
; o/ n" y, x* {8 q& g3 P7 O#include <sys/types.h>
" J1 S, S; @/ F. P! F6 }- J' j& M3 f# z#include <fcntl.h>
/ Y6 ~; t( d! }! N; ~1 N
) c9 l4 J" y% }& P0 e  O#define SHAER_RAM_BASE_ADDR    (0x80000000)( |5 V9 j' `) G/ L
#define SHAER_RAM_SIZE         (0x20000)   % F( q) t% Z1 |  b

0 U5 V3 F1 D7 R# ^+ _typedef struct
% j2 D. j7 w- S, q{
) ~1 \3 \- \: `0 w/ L! b        unsigned int a;
/ s0 H# n  c& [        unsigned int b;3 W0 c- e% w4 k# ?
        unsigned int packet_cout;/ E9 j: T- {" V* o0 y
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: G# h0 r7 t, q/ s3 p% I" J8 q* l+ [9 b: Q$ `0 F; Q* l
void read_MSG_buffer(int *baseaddr);$ |" y$ v  J1 q; a! b3 C
unsigned int count_copy = 0;
, _; X' i  s4 ~9 \; ?* B
2 I3 G# \( U' ?0 W, dint main()& j2 E: Q+ B" u, p+ q
{
; [: s5 U  `, o& Z9 R        int fd;
# }* v+ v9 o2 |        int *mem = NULL;
- ?9 E. n/ M& @, \( l" _( s& i/ i5 W* i/ L- J0 T0 _
        if((fd = open("/dev/mem", O_RDWR)) <0)
  }( c) n( D$ v' d0 d- J        {
3 Y7 k0 r" M( c$ A4 q                perror("open error");
* k2 N- N; E0 u, E) t                return -1;1 b( c" b6 D7 I; N" V. X$ V! [
        }) x" a& b5 x) e6 f+ l" p
        
% ^! c3 T/ d# ^3 F1 T        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
. ]* Y2 o+ ~. e9 _$ T
! e5 N9 b8 {; {  }* J9 I; C3 ~        while(1)$ @# |) H( M! B/ X( v# v: K
        {& q, u7 v9 {: M: c% }
                read_MSG_buffer(mem);
5 {# B* {7 ]  r) F/ s6 I; @& M        }               
/ I. D- Y# e; C1 u( a}
( i/ r% J" Y- ^
( C( u" c( |! k: v, X: E8 Mvoid read_MSG_buffer(int *baseaddr)5 w/ |: M% [9 X; y
{9 B) D6 V1 d0 m2 B% m) u  l5 H
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( u1 c. C7 V) y9 S$ K
; K, N9 b7 N+ A* ]3 T" m) K8 e        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 i( a( X! t) Z4 D
/ V: e( _0 i, P& E/ s+ d5 s        if(pshreRAM->packet_cout != count_copy), n5 {; G3 T* w: U5 z" K9 g: o
        {; F0 U$ ~: M- Q- K% J- o6 }6 l4 u
                printf("a is %d\n", pshreRAM->a);; s- x: O+ @0 y; P6 X& W8 i& |
                printf("b is %d\n", pshreRAM->b);8 L* o6 ]; Y' c7 R! x3 I  }7 U
                printf("count is %d\n", pshreRAM->packet_cout);
: L$ y* x/ i% p  w                count_copy = pshreRAM->packet_cout;7 }; @4 y5 b. u( F
        }
, z7 c7 b4 k7 P        else. L% ^+ S/ f! g; T  W5 T& O. y
        {0 t4 Z5 C, Z; ^5 A
                printf("No effective message!\n");
$ V5 B: e& D2 E# ^/ F        }
/ b& Y0 h4 t- S) J" _& D0 T}2 E: i  W! \9 a6 ^  C5 J  W
% A, K1 s0 V  V5 J, j& A8 m
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 J8 H, j" R/ H* u
; Z7 y, W9 V6 M/ S5 z, n

$ g' J$ G# K. u% m- `" i& b
1 R( Q4 c- M% K8 {: b. S
, y% D- @, D2 w" H( _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-3-8 01:36 , Processed in 0.041210 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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