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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
' K% N) r- D5 G- e8 y" n2 V; L/ y1 Z: D  u/ o; l
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>4 a7 k( G- D$ f
#include <unistd.h>
; e$ S1 C6 ?( ?+ G& ]#include <sys/mman.h>
5 \- t' j1 T6 p3 O- ~: }7 ~#include <sys/types.h>
& a% }9 G7 e5 F+ f$ ^8 {' _$ s#include <fcntl.h>  \# M' S5 a+ P2 C  R* ]! H

. ^& n! C2 g4 b( H/ }( X. {2 V#define SHAER_RAM_BASE_ADDR    (0x80000000)   
/ w9 {& e) G4 H9 Q" x
6 y1 N( e& n" U1 D" L) ?typedef struct
1 K' l. f8 ]' ]{
9 ^$ y5 b4 Y- Y' F7 A" x; w        unsigned int a;  t' s0 M# q# g; d$ j/ ~7 {
        unsigned int b;' T# c4 \0 B1 ^. g& Z' _
        unsigned int packet_cout;
' u, v6 c7 f; ~4 }5 x; O! }4 W}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. W* `. _# _/ R+ O6 H/ M9 ?4 r2 z2 i; ~: a6 |9 }& w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 @! `- C) Z5 A2 y/ t( f% m- `
unsigned int count_copy = 0;
- w# p* w7 W5 ~4 C# K9 M: E/ V% ~& m& O6 ]+ k( [' z5 t4 J' _% |
. m! U. A9 o1 }! V/ _: b- L# X: ^
int main()
/ n+ U4 P7 ]/ d( u; J7 [{5 W/ S; j/ }1 C& {; J; k5 u! a
        pRX_MSG_PROTOCOL pshreRAM = NULL;
5 F3 [4 |. J! w" ~. b" c( j; O9 q' _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;5 r* j* Q  s# P0 p+ ]5 x( }
2 Q. V. T6 z% s9 c
        while(1)- k2 Q  H) B" @8 d0 Q, L9 n
        {
+ [/ d6 I- r) x! P                read_MSG_buffer(pshreRAM);4 C: j; u) B9 K( ?- U
        }               
" `. O# t- M" y2 e}# c" o( H3 Y: j& E5 V/ y- k
3 G! g1 {! H0 E# ]& R8 C5 K
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
& l- R$ L) O* e* L; A) v5 A6 _{
8 p" @, e/ f+ q2 x( i        RX_MSG_PROTOCOL buf;9 |4 X: G5 E+ t
        " o# \- P1 M2 h4 [+ ~
        buf.a = pshreRAM->a;
8 E, {- k( D  y! y# @" S3 z        buf.b = pshreRAM->b;
2 m' K; H$ q# Z4 Y        buf.packet_cout = pshreRAM->packet_cout;7 `# Q0 K; d+ D" B- J8 X7 x
        # h1 l( F* @; F1 K$ Z( _6 W
        if(buf.packet_cout != count_copy)0 `# L* Q$ K4 q! q# |6 W- Z% Q
        {' d, Q5 r2 K9 s' k
                printf("a is %d\n", buf.a);4 |- h2 h/ Y/ f8 H/ W0 S$ M
                printf("b is %d\n", buf.b);
* j/ }5 H% E1 [8 w9 ]                printf("count is %d\n", buf.packet_cout);1 r+ X, G- ~% Y& z$ u9 r" U7 m
                count_copy = buf.packet_cout;
, C$ Z/ L- |5 `6 L' Q; x        }
* `1 C: k4 W$ ?$ U5 N6 d        else- z- [) z& B' s0 S6 p+ z- u
        {
6 ]8 W4 `: g( n1 R4 I% R                printf("No effective message!");6 E4 l0 u. p% \- @% T
        }
3 E; a, @! v: z5 q}
* V% n3 ]4 q+ x- p
8 L+ ^) l1 V9 M& L' i4 s6 j; {, P* v4 }8 y  z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。- E3 ~7 \/ J# p9 ~
使用下面代码,对内存使用了mmap函数后:
; }5 D6 S9 y; U3 b- ~#include <stdio.h>5 p# N; Q' }8 w0 m2 F5 s2 o
#include <unistd.h>
4 Q) {$ ?$ x1 h" C3 Z4 K6 \#include <sys/mman.h>2 n0 S$ K" I$ m# {( w' c
#include <sys/types.h>
+ b* X/ _2 p1 S7 B$ l3 J#include <fcntl.h>
& R- E8 y$ G; x* {# Y# n( V8 W! p5 a" h0 _% H
#define SHAER_RAM_BASE_ADDR    (0x80000000). A+ E/ a* b2 D+ _- Y$ g4 Z% P! W9 i
#define SHAER_RAM_SIZE         (0x20000)   % d1 k/ g+ J  I" C

% S6 v# }) L9 I" r- [7 I+ O" c2 vtypedef struct
" ~5 m5 b& H* v* K, k# ^{7 I+ \- M% _  k, W5 q+ U* v9 X6 k
        unsigned int a;3 }3 ]- g* D( z# g
        unsigned int b;& P  o6 ?7 B0 ]- n7 y) j
        unsigned int packet_cout;  a& \: V7 U- T0 i: x, ~! ?
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, Y1 ^+ {8 W. F8 c' W
! f2 X( e; F5 K) svoid read_MSG_buffer(int *baseaddr);8 h# c) s7 O9 p3 z
unsigned int count_copy = 0;" l' S! S2 g6 t

# \. r6 T7 |6 ~; d9 {+ Z7 uint main()! S" I* \/ K5 a( ~  p
{
" J, C2 ?1 ^6 P6 |9 x        int fd;
; b* [" q. W; s. T. Z; L: j        int *mem = NULL;" l/ a' s  y. Z7 Y

# M9 I6 U5 }3 l+ L        if((fd = open("/dev/mem", O_RDWR)) <0)% L" e6 }; }* {8 C+ Z6 ]8 m/ j
        {; ?7 x! Q2 ~- U) O
                perror("open error");
/ y, s; k. V* f0 X                return -1;2 R4 v* o/ t: w# ^' N" N
        }
+ y- y# R6 }7 o* q        
2 x' H5 n# V: P% M. I7 H        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);* v; y4 R# }! q/ A1 B" i/ Z
. g% R6 e0 P0 a' G
        while(1)/ g# n% q& d. C) v' ]8 E6 `, \2 t
        {. V  P0 m# n$ n( M# p! ?
                read_MSG_buffer(mem);
( q& g3 f) L1 Q        }               
9 O$ S* {! L7 r}
- k2 H  r, C0 B' r7 l# J% W8 Q" k0 l6 r2 L' Y* b0 ?% q
void read_MSG_buffer(int *baseaddr)
# P% a: x$ j) m) w{
# x0 u3 j3 I* D" b+ Q# Q        pRX_MSG_PROTOCOL pshreRAM = NULL;0 P( l3 [& G" {- M
. g0 N) o0 q: H, S1 m( S
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
# |% E4 ], X) {  O: H6 |0 U1 H; W/ p
  o1 [( f& G3 T* C        if(pshreRAM->packet_cout != count_copy)
0 Z/ `( G+ f" s5 T        {, `: t/ F( Z0 w( k3 x5 n( Q7 {
                printf("a is %d\n", pshreRAM->a);
# h; T; }$ s" a" r0 a                printf("b is %d\n", pshreRAM->b);" r4 e, h& W4 u( w" u* g6 R; W
                printf("count is %d\n", pshreRAM->packet_cout);
% X: c! O, e! h; A8 U2 k; j# |                count_copy = pshreRAM->packet_cout;$ z' v# Y( z% P+ O
        }
: G1 e6 j0 |; v+ @9 _        else
9 }& ~7 B% G* Y        {
* V, I* ~( p0 v  M* q0 \* a% m                printf("No effective message!\n");+ |# O) w0 L, L, W+ N
        }( u, I4 a) f( B! o1 Z0 ?0 O& I
}
& ~2 A' f' t) k& g) R3 j3 m+ k: Z5 v% P) n* @" n$ Z
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. a. a, t0 g$ F# Z; P. E3 m% c0 E8 F2 F5 w! h$ }- `9 I# S8 a
8 l; w  m4 ^. M6 L% S* k( X

( \0 H1 U: N9 a- X( |& \& k7 W' U
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-1 05:28 , Processed in 0.039645 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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