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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
& S5 T8 Y: {) d5 s/ K8 u* C1 X# S5 v, W4 L% w
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 u0 {9 N- K2 W  J2 T; g9 s2 R  m: I
#include <unistd.h>
5 e2 V/ N# P1 q#include <sys/mman.h>
! {, H4 R, y7 I$ {% X#include <sys/types.h>
$ \5 h+ T' b6 M6 b4 B( u& c#include <fcntl.h>
5 w( O! M7 A. _2 H0 U7 N
1 J- {2 J: D# f" k: m, Z% T#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- I0 X6 |) M; `
3 E  t& u+ n# R( A- o, @5 _typedef struct
" i1 J4 H) I( n. w* V{
' H& m& `; W4 Z6 J; U* N8 m5 O        unsigned int a;
; R- O0 ^. a& M  G* s8 \        unsigned int b;% T! ~. h* t& M; Z4 h
        unsigned int packet_cout;7 z4 Q. E8 Q9 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 N/ T  o5 \0 r0 v

( c; @$ O$ A% l: Y' cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);8 u5 }- R: C$ A& ]4 B
unsigned int count_copy = 0;
$ O! l1 S, o; f* Q4 a
. b" c. _! y% j" O1 V
6 A) H2 |) x# w3 lint main()
- y6 [( x; W  [0 i{' y+ B0 F* Y, M) h) X, K! c
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 Q" a+ }4 h9 K# c/ Z* W        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 |0 I+ q3 E$ J$ j( w' k

- Z5 }" T: O9 u        while(1): [( D% u! k/ w" K" e9 _( a
        {, u  A  ]  R; |4 E& F* J
                read_MSG_buffer(pshreRAM);
, |4 R( `9 x( R1 K* ?3 i        }               
- Q8 v) D9 N0 r0 t8 t}( ~9 g/ [( s5 j. u, b

: x, ~' S/ P# N$ Q0 h0 Rvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)/ i  l( E$ A# K" R
{
) k% D5 [# i5 G# `9 ^; ^- n7 T        RX_MSG_PROTOCOL buf;
% B) @5 O$ |1 a8 ^4 t- C7 r        * a9 e% g  O; O2 d6 `. L3 _6 q' U! X
        buf.a = pshreRAM->a;
2 @% [- o5 b2 B( Q; e        buf.b = pshreRAM->b;
' _2 g6 w' x! A2 _. O, i9 g        buf.packet_cout = pshreRAM->packet_cout;
6 r/ p- p6 Y, G        * U+ {# _- n& @% t' L: i/ C: h2 J9 |
        if(buf.packet_cout != count_copy)
$ e" V8 D4 o& j: I- b4 D& G        {
! D  A4 W4 M9 x. O                printf("a is %d\n", buf.a);
3 X: l3 s3 G1 x7 O& [+ e                printf("b is %d\n", buf.b);2 B6 K% u, q3 I0 F1 G8 A
                printf("count is %d\n", buf.packet_cout);' e) O: L4 E" P" s% y8 L. P7 I6 h; k
                count_copy = buf.packet_cout;/ V/ g. k& k: H8 X3 K- X) x
        }5 ?6 I1 q; S" a7 j
        else: I/ ^+ @# N" H/ R2 R
        {
( R, T1 [" g' q0 p% s( u3 v8 F                printf("No effective message!");
; {5 |$ x2 Z$ ~, B, t; E; p- ~        }
+ C0 f! C+ t9 d$ a  ^+ L# ^2 o}
7 e3 h: O9 u( c( N: d$ S" j  q
8 c8 t, Z+ W) ~) S7 P
5 b- d/ J' x' V% D但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ @  O( \4 j  x# ]6 ?5 p7 m使用下面代码,对内存使用了mmap函数后:2 f5 V- ^# h4 I% T( Z0 e( s& n
#include <stdio.h>
0 [* |5 e4 c- n% A! r) l#include <unistd.h>7 H: }0 Y; [( y5 S7 w& {
#include <sys/mman.h>
) k0 x5 m, e: ]: v0 ?#include <sys/types.h>/ T# _1 V' X* Y8 V: `+ l( W( A6 ?
#include <fcntl.h>4 j: n  M/ ?9 e, d% N, ]3 ~

4 H# a( C& Z5 R. e; ]#define SHAER_RAM_BASE_ADDR    (0x80000000)  t1 z, U3 g! A
#define SHAER_RAM_SIZE         (0x20000)   
: N+ n* C/ C2 [: e0 l/ k, O0 I( q) v) `9 }) B9 i
typedef struct
! j$ y8 ]# |$ w9 ^: {$ K{
; T* @/ t9 i5 N5 E8 O9 O        unsigned int a;& q) l- H4 C7 ]6 E2 `1 ^
        unsigned int b;
6 ~! E% W7 b1 o& m0 j  K4 J        unsigned int packet_cout;- K3 N1 _$ C% O8 ~# q$ s
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
. b8 o5 o. L9 C+ F$ a( x
- p7 i0 P# y1 d  \' n9 c% X8 Z5 Ivoid read_MSG_buffer(int *baseaddr);% E1 n: F7 M) X2 }
unsigned int count_copy = 0;
$ s# x5 [! z/ N$ x7 e; Z0 W; Z; p9 S& C9 ]* e
int main()2 r# I, s5 Y- z1 q
{& ?5 d7 j; s  q; p+ \" L, y2 [
        int fd;
5 U: N4 u) O3 j1 y3 v5 x5 [        int *mem = NULL;
8 H  ~3 P. R$ j( C  l: n7 O) w. u% a' j1 u  s  X: p' X. x( R" K& Q
        if((fd = open("/dev/mem", O_RDWR)) <0)
* \' @* A- ]( |+ Y  ?) G        {; I4 y. @( e% z( |, ^8 V5 @
                perror("open error");
4 c  p4 d: n- h: l                return -1;# W0 Q7 r% ?. }/ P- X' {$ M
        }
" v2 I4 V7 G# e; z* Q8 T5 d        
/ [$ T: z: y& L; D        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 m. ?5 @$ y3 _

9 A, V+ ^1 M( k        while(1)' P/ [  b4 i9 X- R
        {
; T" j0 E& g* W* d7 Y4 ^1 P8 e                read_MSG_buffer(mem);% ?" Q; K! m$ U; g2 q; Y
        }                3 Z+ h# z; [& N2 |6 @
}  |" _* g! q  N8 E
. |6 `; O0 X% A7 T6 \
void read_MSG_buffer(int *baseaddr)
. E- K  {/ k, P* F{
' d$ X& u4 b) ]& T. p        pRX_MSG_PROTOCOL pshreRAM = NULL;
( @9 A7 A; K# W4 Y7 j$ x* V- L# q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;( M3 N4 I8 A+ y9 Q% c$ r
  T. j1 x( Y, B& I/ ~% u$ @: J: I
        if(pshreRAM->packet_cout != count_copy)# j" p4 y3 m  e: |
        {  g' ]# N6 r* [" z1 Q" f
                printf("a is %d\n", pshreRAM->a);
) C% R8 J/ I# @4 |. P3 S1 \/ K                printf("b is %d\n", pshreRAM->b);  P' {2 F+ T  E
                printf("count is %d\n", pshreRAM->packet_cout);
1 K2 c' p" k, {                count_copy = pshreRAM->packet_cout;4 J! N7 p( ~: \1 N" N
        }
+ B7 p9 H( A" e- \' d        else) C) _8 C5 U1 Z8 K
        {
0 x6 s+ ~! p) ]9 q  x, q7 G                printf("No effective message!\n");
$ L* i' o$ O0 I, h! b8 Q9 _        }
& v0 w* T+ |9 R, V. H2 `}
+ N+ a+ p7 s% D8 x8 c* Z* ]  D, `' c% O  v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
: K) h) y% ]3 ^* k" d2 Q
# i3 w- G0 T, A5 E; s) B  A% V- n) ^3 `; b  k; o8 G* V! w$ S1 p

# U: f4 y9 y* x1 ~4 ~2 s
1 Y& M4 J, Y  m) k3 I
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-13 04:33 , Processed in 0.040829 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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