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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 l) |- U4 b( U6 Z  H  R: \; F+ L; h( K( t  p: O% H( ^
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
1 D4 e* u6 |$ _' u  E9 H8 x+ j9 v#include <unistd.h>
  O& P* s  c- c- H1 t  C% m1 q#include <sys/mman.h>- m; }9 Q; z# W* N
#include <sys/types.h>3 G4 y1 B0 U6 s$ O" g
#include <fcntl.h>
( H% |/ K( E5 n% t+ x' f0 w: K/ @- f! B
#define SHAER_RAM_BASE_ADDR    (0x80000000)   5 c: I4 t- x" q/ z+ p! x0 x

+ h& V' N! \& mtypedef struct7 K6 I6 S. W+ c1 e0 T% Q+ V+ K
{# U8 P1 r  _: K
        unsigned int a;
1 H/ k; S* B" `! h8 W9 F, s0 ]+ l        unsigned int b;
% W6 f+ j9 b: r. ~: k2 u        unsigned int packet_cout;
) X8 z) N: y- D# p$ p}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- e7 x/ `8 \0 e1 V) a/ Y# n( e# C- ^
7 |8 G1 \% E0 Vvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* ?5 [# m& s; z2 h! F  ]
unsigned int count_copy = 0;
) i. o( x  B- b% Z$ B2 C' [+ F% q
8 t: N. Y' l' H6 W
int main()
% _2 _: P8 c& {4 X5 I. M4 b6 h{
4 m6 Y0 p0 e! }8 ]        pRX_MSG_PROTOCOL pshreRAM = NULL;7 }. U* m! }/ u+ c
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
$ J" z1 h1 I; |3 Y" B' i
. h: T! ?9 |/ G5 }        while(1)
& b/ w0 i) j+ W        {
4 U2 W& J+ _$ ^& |5 A1 z6 q                read_MSG_buffer(pshreRAM);
9 K# u8 @3 u  t        }                - ?' h' B7 p2 }( x; w3 G' }: Y
}) B# W( o$ n  G& O
7 k; _5 ], R1 X* @, F5 A/ ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 l* e* A- ]& S5 f0 a9 J/ I8 ]
{
$ s% ]! F6 K# D# ]9 m+ n$ r        RX_MSG_PROTOCOL buf;% ^  u( B* G+ J
        + U  B, y7 b; A) Z& l% S5 w4 V( K" Z0 B
        buf.a = pshreRAM->a;' ]1 T1 J6 O) o* j4 G
        buf.b = pshreRAM->b;- b7 _) d5 \; }5 u, q- c
        buf.packet_cout = pshreRAM->packet_cout;
3 o+ W* E. i. ]; v        
7 \( }# W3 D2 P/ q6 V- t7 I        if(buf.packet_cout != count_copy)
' ~. x( C" p$ V        {: g0 H/ P: {+ p' g8 u8 `1 \6 x9 f: ]
                printf("a is %d\n", buf.a);6 P: r: ~1 l* W( m8 B
                printf("b is %d\n", buf.b);
4 U; t7 M% s  ]7 q* E( \% C                printf("count is %d\n", buf.packet_cout);
3 m3 ^, ~" G- a- d3 v5 Q                count_copy = buf.packet_cout;" c- g4 G. H, X" D  }* D
        }/ `0 ^. r1 J. M$ e  _
        else
2 a* z+ \$ w" X# i# O+ w        {
9 S' K! f9 Q0 j. Y                printf("No effective message!");' X% u+ L$ d- ~
        }0 u7 M7 g: e- V% U
}
( S  |8 k/ H8 `. l5 q
1 q) q8 N" F9 c$ x
" R- J) E. y( L* u5 v3 |但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
  X/ E( j0 ^2 J  S6 G使用下面代码,对内存使用了mmap函数后:% P. a) w6 y. _
#include <stdio.h>
+ V8 D! y' z7 l% g: k: ~' \#include <unistd.h>, ?) ~  N# I2 q9 `3 p8 }2 ?
#include <sys/mman.h>
3 d% c8 R, r* a+ [: F" f9 i#include <sys/types.h>2 a# |" r2 ~# e
#include <fcntl.h>
/ Z0 }( g+ g" t7 A2 D4 \. _2 C4 U
) C/ o; F9 `) @#define SHAER_RAM_BASE_ADDR    (0x80000000)
& g& e1 S( k% T4 m5 @( C9 M: _#define SHAER_RAM_SIZE         (0x20000)     ?4 F" B+ {. f) Y% k/ A- o( Z3 h
$ m# G* K& @) Z! N
typedef struct; O1 C- v- j( p1 Z( x  @
{
0 G! _7 k1 r5 ~- e1 e        unsigned int a;
! T5 D: Q6 W. }  l  b; H        unsigned int b;
" v* U9 |' o+ g: C8 a; ~        unsigned int packet_cout;
* r; ~6 @" F2 s3 L' _7 p0 l}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
" U# s* k6 @: v) j; M3 ~7 _
( q/ ?7 Y; e) ]void read_MSG_buffer(int *baseaddr);, k" z% P5 Q$ R1 D' P
unsigned int count_copy = 0;
8 g6 z1 z9 q  r; C
9 d3 }6 i  K6 l# v3 Z5 Nint main()- p) }  p* n: n. R. V/ _
{
  @$ d" W' W4 |: y4 C        int fd;
3 k8 n. k% ?1 g1 y' p) R, ~3 A        int *mem = NULL;
: E& \- H# ^1 W: C; v2 P* ^5 `
9 @/ X) c( I( t+ D0 P        if((fd = open("/dev/mem", O_RDWR)) <0)
( g+ D9 O$ X$ ?3 C0 V& _) m! e3 }        {
- Z7 |3 b% f" y. M0 D                perror("open error");4 r0 x0 m, V* K" h, O" J
                return -1;
7 I, h8 N- a  A* M0 K        }
: G" ]; C! W2 g" z# y        
( x6 N' H8 j1 }2 X  `) F8 w0 Q" I        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);# J1 X( Y: J$ m7 ^, c: L$ K# D

  h6 g4 P1 j0 K% P        while(1)
. p6 G7 ~( Y+ O! [2 h1 k        {
' ~  L/ }5 {4 c  r" p: f                read_MSG_buffer(mem);
6 s+ a7 ~; c& o4 n% |        }                0 v9 L; e9 ~( u
}. @0 M# [2 A5 D; k( p% A
4 ]; s; q  t" z8 w( W) Z
void read_MSG_buffer(int *baseaddr)
! g# u7 ^! S; J! x- L3 k* K{: ?+ Z5 t6 n) u% E# l: u
        pRX_MSG_PROTOCOL pshreRAM = NULL;* L$ q+ g( ]  W4 R5 I

- J8 E0 y, U: X2 S' M8 _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 j* ^2 Q) D" V! \: `; E8 ?
& \) U( K3 n- T) Z! I. x  c
        if(pshreRAM->packet_cout != count_copy)7 ~% N' [+ `- L2 [3 d9 b& J
        {0 x+ E" F, _% w# J/ F- F
                printf("a is %d\n", pshreRAM->a);4 R/ G& ]1 m0 n  l1 Q
                printf("b is %d\n", pshreRAM->b);0 h* y6 I0 _: W5 {" o) Q* R6 Z5 ~
                printf("count is %d\n", pshreRAM->packet_cout);
% M& ^9 v# O9 Z3 T' v( o6 c                count_copy = pshreRAM->packet_cout;  M! i: F, `3 N
        }
9 _$ l( z/ u3 m0 W2 O        else$ c9 d4 z: Q' }; {9 f( q$ j
        {
- Y# N+ W2 e% Q2 B0 C( A8 d5 R; f                printf("No effective message!\n");1 V2 K/ b# m1 W* i* g2 V. E# u
        }5 o/ ]9 f  T6 B8 ~) Y
}
$ D9 ^, s) x, z2 w4 r
+ U5 g- e2 A: @. e9 Z8 I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???/ ^- E7 J' e1 n" h5 c
  l4 p( j. ]! ?4 r% m: g6 l

% f! x! S  u2 s2 n  {: w. r, q+ s. w1 h
5 X3 x! x) C8 p7 [7 F
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-20 11:27 , Processed in 0.043155 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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