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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
( \3 B, M0 r" |7 M1 Z; r7 a3 Q
1 f+ @* O5 z) D: D, l) ~OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( Q  o/ a/ r) g/ h" t; Z0 t8 X#include <unistd.h>
" ^3 w+ O8 n& g#include <sys/mman.h>- V0 d# _1 g: {* V: H
#include <sys/types.h>5 p8 B0 m8 q& ~6 h' f$ j/ v- U
#include <fcntl.h>
8 m/ K! ^, c: ~8 V* j4 O
$ ^: y/ t  H; [: U) y  D#define SHAER_RAM_BASE_ADDR    (0x80000000)   
, v4 {# W3 m% C* q6 P0 _" l, e$ o7 }; P7 q
typedef struct
3 m/ P; R  c9 l7 p# m' d$ L{
2 o! J: M- v4 X2 e- f$ v        unsigned int a;
1 z! ~# |% V1 L) M% ?5 P* o9 s        unsigned int b;0 R) m" \3 S# e0 k7 X+ [& v
        unsigned int packet_cout;
, p8 _& m9 N; j}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ]  O' Z; y/ v/ @4 u1 K
- m3 p, J7 q1 cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 W* G% M. m0 c7 q: f" E7 e1 funsigned int count_copy = 0;
) z; B* ~' m& [& {3 j7 z1 v  o, A' C* [

( e: _) `& m9 U3 o  zint main()4 [; K6 x6 j) G7 g3 ~; z1 R, D: J
{1 D8 q+ T8 V# Q  F5 W
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 R. p! ~$ ^4 J! J
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
- L' t/ `/ O. _2 m. t! _8 I, ]# R7 l5 Z, q1 h
        while(1); i: e" l! I/ T- J1 k: i
        {
  `' d4 @8 ?. Y3 R                read_MSG_buffer(pshreRAM);, D! c3 s# O3 W2 c2 z
        }               
8 ~' F3 ^& z( j$ S& n* J}
& m$ v7 ~% G; i1 x; |) O8 t
. i5 c* ?; t7 B) k% ?) k# }* yvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- u/ X3 N0 V1 c* A/ v
{
$ l/ p9 h$ f5 v, S! z; z( N/ j        RX_MSG_PROTOCOL buf;
5 Z( g/ X& `6 f, ?        0 _, j: G3 }0 L! ?9 ]
        buf.a = pshreRAM->a;
7 f  A' X& d' c: {+ g' t3 ?$ R/ }/ v        buf.b = pshreRAM->b;
- k) q+ K, G$ R( O1 o& X2 {6 O        buf.packet_cout = pshreRAM->packet_cout;9 u% G, D8 Z: l0 D1 |) |
        ' N* I0 c$ X) O" l. [* e
        if(buf.packet_cout != count_copy)
+ e: M) s& S5 Z( G9 c; ?' i        {
$ ]7 o3 e3 W2 g                printf("a is %d\n", buf.a);
! O# w/ R  u5 Z                printf("b is %d\n", buf.b);
: Z5 L8 `% u8 O8 T$ G* ?                printf("count is %d\n", buf.packet_cout);
8 t8 b' @2 G3 P. ]                count_copy = buf.packet_cout;7 g1 y0 w- L7 t, S% K
        }
+ T+ t* j* V) {1 P: K* u- v        else  R5 L' ?( K- n# @, n# U/ T* E
        {
. F( n4 y4 _. [. H4 o! i& e" X, l                printf("No effective message!");
: {/ ^$ G% V$ W  e. Q: R% t        }
% I! Q$ q/ ]& ^- Y}* K6 |. @1 S: M6 M% N( y9 @

, l8 y* J! y( N9 {- C3 D9 p* `3 N2 q! a
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
6 N, ]; x! b7 T6 R' p7 g( Z% e使用下面代码,对内存使用了mmap函数后:
- B, d( I( V* @5 }7 _6 v$ C6 M9 R& Z#include <stdio.h>
8 X% T1 X/ Z/ ]! ^$ X#include <unistd.h>* o+ ~, Z. L/ E/ O) @
#include <sys/mman.h>. F/ F6 q  D" E/ g' Z" s
#include <sys/types.h>9 g( m3 F4 j  u/ Z
#include <fcntl.h>
2 [2 z1 \/ l4 [" L  J
7 k, B" J) L, P. r#define SHAER_RAM_BASE_ADDR    (0x80000000)' X: c+ p4 j5 @$ I
#define SHAER_RAM_SIZE         (0x20000)   
$ ~8 V( P9 i  v  w$ W7 n. C
* m+ A% K9 T4 z8 y9 |typedef struct
7 |* ~/ ~6 l2 `' b; J{
- y  g9 O( `) L; b! Z- n        unsigned int a;$ A; \) m, f5 h' \: `0 s
        unsigned int b;
9 Z8 A, d4 l; ^/ e2 P, m        unsigned int packet_cout;; n: X3 a+ K9 `/ {
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# A% u% u1 E( N- v. M( C; e1 ^7 c
: ]% \) v8 s' y, w" ?  ^" i
void read_MSG_buffer(int *baseaddr);
* @# L3 s0 H/ [4 ~' i1 }4 g; K9 Uunsigned int count_copy = 0;
# W4 d1 O0 U& _( z8 c& x) I5 J, m- x$ V
int main()
9 z6 h2 O- z5 `/ Q  ^{
5 G- d; t, `  W- u! O        int fd;
; ]# C* c* p; O  f+ X        int *mem = NULL;
; k* c; u2 w8 [  ?3 q: f5 N, V
7 N" E7 X& m! I- M2 X5 R0 Q+ ?        if((fd = open("/dev/mem", O_RDWR)) <0)  `# t9 F' Q/ K, Q7 N: N3 S
        {
& N: E  f& o! O) F3 e1 }                perror("open error");3 i0 y: B; [: Z% a$ O9 e- X8 Z$ t
                return -1;
5 u8 T/ g( c( A6 N# S        }6 {' z! P7 f4 F: {+ p% `
        - U7 R4 P) ~9 c7 z5 {* |/ [% y6 y
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ O# Q, _9 f: m' C7 f; i% k! A1 g& m
        while(1)4 A7 O% G+ Y$ ?, m. [4 V4 A- _& Z+ W
        {* f3 c  l% |* Q9 e' X
                read_MSG_buffer(mem);
4 W' E: ~& z1 D0 X( i# ]        }                9 m9 l. ^1 T3 T
}
$ ~$ j  G* t! H( e5 j! L' I% k9 A. U% _, V$ p% Q
void read_MSG_buffer(int *baseaddr)
0 d) S# Z% {& |+ J3 i6 z2 A{7 X2 K) S" |  ]
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 i5 H$ s. K! I7 i* F& D0 E

9 E3 @; E$ w/ G        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ [* A6 x8 m  w5 `- l

2 \: |8 o, D7 r6 a0 U9 v8 [' O        if(pshreRAM->packet_cout != count_copy)* `+ x* ^; m0 J7 M" f2 C  G  M
        {
9 H2 }- k# |; `                printf("a is %d\n", pshreRAM->a);
- E) N8 |( k4 C) z: Y( }                printf("b is %d\n", pshreRAM->b);
$ R& ^) }: b( @3 ]; d% k5 ?                printf("count is %d\n", pshreRAM->packet_cout);7 w7 E' @% ]. Z1 U
                count_copy = pshreRAM->packet_cout;
: [" @4 k$ q7 G! {& Z( E+ d1 C        }  E/ S9 B  M8 A; N/ L9 b9 h
        else+ y$ k/ n) s& v2 z* m  p
        {5 z* ^! j. D5 ~' u) H
                printf("No effective message!\n");8 Q! Y# h; o. x- Q: ^
        }
" `2 N- F  g6 x+ y# T}
, m! J6 Y$ i! h5 ?2 b
7 ?' s' v; m! w/ g没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 F) S4 }4 _& j' Q2 Q+ r- k: o& m

; b9 `) d1 ~) |8 I7 S4 i! R$ @0 o' ?
0 J+ N4 `1 X" `. H4 @% \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-30 19:57 , Processed in 0.052306 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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