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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 / p  e& V8 A. h. ?, @

& q0 d9 m( D! x0 F: r7 z5 sOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
5 A( }$ E8 d# c' B, r  q1 I: J1 R8 p#include <unistd.h>6 @- t& {7 @7 ^5 f3 N
#include <sys/mman.h>2 M4 Q% }9 V3 c$ Q: W8 L4 s5 V
#include <sys/types.h>
1 V3 J5 Y, L) B3 ?+ d6 S3 }8 y#include <fcntl.h>
4 E9 D" x3 ]! _2 _
9 X# J7 I5 Q% U; s( o2 e5 I% j#define SHAER_RAM_BASE_ADDR    (0x80000000)   
) y/ B2 u, e4 X
; ~7 Y+ c* j' a( ~3 r. Ltypedef struct
3 v* A0 j; q2 y* p{3 m6 G- S) C8 O% Y5 H
        unsigned int a;
9 s. e: G& p  E( k' F3 D        unsigned int b;
0 \1 M; M3 Y; w! a2 Q' M        unsigned int packet_cout;" P* `# J$ n7 q, j6 _+ ~& y) ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% s3 e5 E- f4 q+ W, j
+ l8 o% i" [7 Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 x* b# s8 Z- E4 o( C' C4 s
unsigned int count_copy = 0;  b) x4 _, @, J! u4 S

; c2 r8 l) u, K1 Q0 o9 R0 {9 Q1 ^4 z8 d! D* S* f" S( H  p
int main()! r- W: K8 Q3 T( B" u
{
- x  d2 B4 u+ I+ r9 h  E        pRX_MSG_PROTOCOL pshreRAM = NULL;
- t- g5 Q8 Q/ @        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;8 \8 C$ H2 \5 e3 g9 h& }' M. c" c  y; x

$ ]$ N5 S" B4 ?. x/ X9 U        while(1)
$ Z" \3 z# t; n# `! @        {
% V; y2 e, C+ \                read_MSG_buffer(pshreRAM);6 m  M3 M6 v- M
        }                & r" K* B7 i- y* a' H% J: `
}
# Q7 P8 e" r5 b: m5 p$ T
' q. L1 G  T0 h! |( s. w7 Evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)4 V1 g1 o8 a8 j5 m' |
{) u# l! D- [. I0 O* W0 X
        RX_MSG_PROTOCOL buf;
0 G& Z. n! ^& H( N. d4 [. y3 c        - R+ X# n# G1 D/ X* x# S. N+ [' Q
        buf.a = pshreRAM->a;% O, ~, l) R0 X
        buf.b = pshreRAM->b;
: k8 h- T$ D. U5 X1 |$ F# \1 C        buf.packet_cout = pshreRAM->packet_cout;& l0 \. D3 p1 f3 [
        & X5 Q% m# g8 C% U
        if(buf.packet_cout != count_copy)5 ?* k0 u2 N$ |
        {
9 O& q3 P* w" Q1 A2 ^8 ?! v: ^                printf("a is %d\n", buf.a);
- p: D, C* _; g& W: `                printf("b is %d\n", buf.b);' N! l1 {$ \1 `# y% @
                printf("count is %d\n", buf.packet_cout);; o  M1 x" Z7 I% ]- c
                count_copy = buf.packet_cout;
$ b, s/ Z! d5 H, j        }
+ [+ x& A6 V* O! B4 E        else' Z# {* K3 Y" a
        {; u: _! [0 |: c7 E1 i
                printf("No effective message!");& V9 e4 O% i+ U) w& _* F
        }
  p9 }0 c/ [' Y  T; W, h( M2 |}, ^* F$ G5 a. A( I3 n5 y7 d7 ~
. l! P# x3 w3 _3 g

$ n& }1 T/ m# T( K1 Q$ i" n但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& w, h* r; D' n% P
使用下面代码,对内存使用了mmap函数后:
5 x% J4 h+ _1 F, H5 w#include <stdio.h>3 |1 g- J: G# x2 v5 i: w& z' v
#include <unistd.h>
# b# p6 h/ u7 y8 w& y9 }#include <sys/mman.h>
8 N9 L; _8 y% `4 c- L4 U#include <sys/types.h>
4 x* u/ E! o' F5 s#include <fcntl.h>
% n& w4 [7 S1 o6 K" D2 |
- V4 H  A, ~9 R6 G. E3 l#define SHAER_RAM_BASE_ADDR    (0x80000000)
8 o* J& E* r' ]4 g#define SHAER_RAM_SIZE         (0x20000)   
2 }: u( ]  _0 B+ n0 l! h7 n/ |& L2 M+ X/ v
typedef struct9 ]  X2 U) @+ f. q3 b" X
{* b. |- ?# k: O/ \+ r) Y' N
        unsigned int a;+ U* n9 E6 m) }, H
        unsigned int b;2 _, K7 t- u6 J  H: X' R" n
        unsigned int packet_cout;' \- i% z: k* N' |
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: J* x. z. y0 `1 e& g8 N' u/ O$ v; o: ~; _3 ~
void read_MSG_buffer(int *baseaddr);
3 b8 k2 P- t: C! Z! yunsigned int count_copy = 0;! C% |. Z6 v8 y$ n2 k
) J5 S! A. k: S% W: W- p& u+ c: q
int main()
  Q/ j  ?9 f7 R5 S{8 F( a0 W/ B6 e  z, X
        int fd;
8 J+ ^# t" R; c/ d: \- L        int *mem = NULL;' l* x  U, e8 W8 i# z

( Q* Y: M+ K' O0 y4 ~) m- X1 S        if((fd = open("/dev/mem", O_RDWR)) <0)
6 p/ E* V% _# {6 p% M! B: ?4 d        {
4 f  i' L5 O2 k# \                perror("open error");
. }8 w5 _) M5 j/ A" M& c                return -1;
, D. z" k; @2 P3 r2 h/ d3 b9 _        }% ]) l% t$ M8 S- c
        - y# O4 Y/ z' p' j4 {" d8 y& m0 N
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 a: q) D, V) b( T

* p' c1 [( O; y9 k2 u- S: B        while(1)7 T3 s9 ~8 v* Y; P4 f' h6 H$ q
        {% p  M# b9 t/ [6 O6 e7 o: n' c
                read_MSG_buffer(mem);, h5 }1 a7 d; v2 Y: ~% ]
        }                0 M6 t6 @2 r5 J/ _1 u
}) Z* M$ t  D( P  ^; e0 D  l
! F5 U+ n, V) X$ Z
void read_MSG_buffer(int *baseaddr)
* ?2 C4 X8 z) l  \1 E% y6 N1 V0 r{
/ r$ F! `+ V- t9 u" z- D; |        pRX_MSG_PROTOCOL pshreRAM = NULL;
* J+ j, d% N! @/ ]
  H+ ^) M: R8 @' K# ~4 _        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;" w- ~1 I- n. s; h0 {2 ?
# {! W9 y: A1 h7 c) o- X
        if(pshreRAM->packet_cout != count_copy)
7 m5 }0 r: T5 P1 P  Z        {
4 l; V  Y7 }$ R- Y/ W: A2 M                printf("a is %d\n", pshreRAM->a);
- r* W3 w3 m$ j; k. L0 @                printf("b is %d\n", pshreRAM->b);/ |- e& m6 g% @
                printf("count is %d\n", pshreRAM->packet_cout);
/ W4 c; i1 |% ?; z5 t% _7 T                count_copy = pshreRAM->packet_cout;
7 @! V" o  g# j4 D6 O) \        }- G7 o+ n7 b& W1 ^- h& i9 T4 \
        else- w* t# X, L# V) F& y- {
        {$ R! _, L6 }. v- k! H
                printf("No effective message!\n");
, D0 T  d4 V4 \) U, z- c, v        }6 m: H' j! I6 d" i
}
" d+ w1 v. n- S, o, b( Z" `1 m( e6 u! ?  p8 f
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  e1 m' d5 D% h& g1 p! I7 r
, H" n9 H: a0 I$ B6 V) {' ^
$ D4 h+ y5 o# D0 u0 {, A3 A
( U% `6 z  a4 m* w
* ~. [) o/ c' h0 i8 z
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 09:09 , Processed in 0.042416 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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