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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
" _8 b' x: i( I, t8 u
- R, t4 o8 F, j4 q- KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 y3 d! u: Q. ]' A+ s, {  m#include <unistd.h>
: p7 a  ]; x& w7 x7 A- G% X#include <sys/mman.h>
; y# e4 w, u' Y5 f- p#include <sys/types.h>
" w6 Y8 C+ i- v#include <fcntl.h>
9 B; S; \" i6 H1 N" X6 y9 m
- o% A  M, Y4 q: n9 |. g#define SHAER_RAM_BASE_ADDR    (0x80000000)   - v) T+ Y6 C6 E3 c; Y+ v7 w, k
+ g7 T; Y% {$ n6 Y
typedef struct2 t( n' d6 q4 t) O
{( m6 a, H+ n4 f: p* R6 m3 F5 K
        unsigned int a;8 V6 |9 _0 W: B6 I  ^% r
        unsigned int b;. b7 y5 y6 k9 l1 G
        unsigned int packet_cout;( z# P- X. e% H8 X6 m3 q/ S0 K1 B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 w* E: E! M% a
6 u% T/ K+ }9 `5 g
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# U$ a+ F/ H. a5 C" x: ~$ J; M$ Aunsigned int count_copy = 0;
1 D: Z6 o6 E( m1 S7 O! M- W
) m9 u7 H4 X# w0 U
) l% z4 N9 P$ h/ b1 E0 p! Hint main()7 Y4 y0 n* k3 h3 J  q% r
{
& S- O' ]5 e' h# ?% q" H        pRX_MSG_PROTOCOL pshreRAM = NULL;, N( n) m- h" a$ @9 b. V4 Z! [
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;+ t% x0 A+ ~$ Z% o4 p; i
" J; P+ y( S3 M) d+ R& o* d
        while(1)
. I2 }) b- h; n8 d+ B& A0 G6 i: u        {/ k- G4 E9 [/ z. v: q* {
                read_MSG_buffer(pshreRAM);5 }5 Y# Z  `- v+ G
        }                ( J0 T9 X2 g& e7 n
}) O+ ]% [6 Q: V
8 u, ~* G0 w+ [/ {9 E% `0 a8 `
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 B! U( R/ P& C  |: R- A{8 d- p6 N. I" ]: L
        RX_MSG_PROTOCOL buf;$ h: ?$ f+ _9 V0 u0 y7 p" O
        / |& O' Z( e8 L8 O+ }( K7 D7 Z. Q
        buf.a = pshreRAM->a;! M) Z& T! h% L  t5 N0 y
        buf.b = pshreRAM->b;% n4 t3 @' Y  H, G
        buf.packet_cout = pshreRAM->packet_cout;) L: P/ {) z" ~
        : j  s/ U* X/ v  A0 ~7 c- G: |7 R
        if(buf.packet_cout != count_copy)$ Y- k+ J/ B4 J; O9 u: G' j
        {
% D' _3 C7 i. C0 Y& r. `! b5 f                printf("a is %d\n", buf.a);0 j  f  @3 c! v
                printf("b is %d\n", buf.b);7 Y/ D) g& e& h2 Z" W
                printf("count is %d\n", buf.packet_cout);
, O& ?5 H% s* O: V- S                count_copy = buf.packet_cout;
6 H8 }( W9 i+ S        }
6 |  m$ u/ i2 [+ _4 U* v        else
, n- ^, _$ G& ^        {' \  c. ]4 a! }5 c$ S) @4 c
                printf("No effective message!");# c- ?6 r. n+ Y1 l0 n
        }( o7 H1 k* X, L1 Z
}- g4 m% `4 o( d' n0 h
$ F) {8 f" S" N) y
1 A& k% H: y4 a1 X1 s5 L
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 j# b6 V7 M, V' t) b8 v# U6 k$ N/ E使用下面代码,对内存使用了mmap函数后:  G8 f+ k/ r: v* s. f. m2 B
#include <stdio.h>0 n1 h1 W5 I, O5 v0 }) v/ a* R
#include <unistd.h>  g; _. n; H& h
#include <sys/mman.h>
0 E# H) I: _0 ]9 k$ j$ c+ U  |$ z) d1 y#include <sys/types.h>7 O; R# Z) Q# _+ ]6 E- ?+ k9 S( \
#include <fcntl.h>
: O& g2 _, s2 |
+ d, S. T& J& S7 d2 Q#define SHAER_RAM_BASE_ADDR    (0x80000000)
" f; c: m+ n" m7 @#define SHAER_RAM_SIZE         (0x20000)   / w. i/ a% {1 `% I' w' D6 J5 }1 Z

$ @# Z% j/ e* u/ [0 Xtypedef struct
0 G  A, H  q) P/ f{$ R5 U' `: t* a7 g' f( s% q1 e
        unsigned int a;1 H' ?+ p' p( C- W0 a0 ]
        unsigned int b;" j' b' T7 M+ I/ N
        unsigned int packet_cout;5 b. w) f" R4 P% U7 v* _. i
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 h* u2 J3 E7 \* c  f

2 R3 k. E9 R: v1 Gvoid read_MSG_buffer(int *baseaddr);
. g2 Y; [& _+ Y# F+ Qunsigned int count_copy = 0;
4 F- G% D# C! S& H% l9 A$ ]6 Y" [- U
int main()
9 X1 d- ^. y( N# @7 R% U- P' B{1 {# P) A& a' O
        int fd;
+ m9 h& Z' A3 L6 y3 X' }        int *mem = NULL;% d  K* V5 i1 s

) X9 j# _4 w5 _: k! A- O$ G        if((fd = open("/dev/mem", O_RDWR)) <0)
9 I7 l3 |& {& G) o        {
: Y- P  Q, C0 ]" f6 z                perror("open error");2 C- h  C* C9 i2 l4 I
                return -1;& i6 z2 `" {' o, B
        }( ~. x5 ]+ y! x0 U$ j  P  ]# k* a
        " A% o8 j$ `4 o4 Z$ ]
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
6 x. F6 H7 n( g# ]2 D7 w4 M; w; K* q  \0 |
        while(1)
6 u$ `, H) d6 u% |% J  [9 ^1 M        {
  v, m; \7 v6 P. F; C9 @$ V+ _                read_MSG_buffer(mem);
5 x" k$ X) Q" `4 ], Q        }               
& w2 O, N! Y% m, ]- p}
/ f; K) j5 Q3 E8 _
$ w; c# x/ E/ rvoid read_MSG_buffer(int *baseaddr)+ D" `' Y: h: n( e1 B, g5 W. Q
{0 ~1 [5 q& ~/ \, }' m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
! Y* j% a! o. g( b8 p# R( X
! e- i* a6 Q# Y2 k( z4 N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
8 K2 r2 @0 x- E& E6 b7 n& }; I; T
) \1 y0 Q, Q6 s# I4 l        if(pshreRAM->packet_cout != count_copy)
6 t4 f  U0 _' l; C; o" l+ c0 k        {  M8 p2 F$ H. O) }, r% t+ O
                printf("a is %d\n", pshreRAM->a);# `- L7 u! h6 k4 A' n" I6 ~
                printf("b is %d\n", pshreRAM->b);0 Z4 z+ ]9 l; @, C9 _' Z9 V( ~
                printf("count is %d\n", pshreRAM->packet_cout);' |4 P( F4 G- l5 D" e. {
                count_copy = pshreRAM->packet_cout;9 K1 o, M/ S9 ~3 Z: \0 n: X' s# J
        }; V$ N( _) R. U  B+ U( b
        else( ?0 s! U1 ^6 B# O+ S
        {; @$ x0 ]$ b$ x
                printf("No effective message!\n");
* {7 f: i# }6 Q% ^) ]        }% \" D) [1 B/ j+ Z% ~& L1 X
}/ E& O% D$ Z6 @7 W
3 o7 S$ d7 q% c1 H3 F; l
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???1 r7 P" k, d3 z& v

2 {3 b* u+ c( S0 m* j- O/ I; ]! |
( J, C8 m3 A5 N( u
" x) O- Y+ x' G5 N* t
  g. H1 [4 V7 a- v* ~- K! q$ y# \9 }6 ~
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-22 06:46 , Processed in 0.040259 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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