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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 0 h* I0 e( |$ `4 O

# J+ E: n3 M  mOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>9 n; Z' @9 g' t! W/ |" [2 d' \
#include <unistd.h>
3 q1 V- g9 `/ Q" Q; X1 z#include <sys/mman.h>
& P+ s) z& u& {% `& |8 |#include <sys/types.h>7 v- T. ?; o8 @( {& H
#include <fcntl.h># i6 M; Z9 f; C# U( Q$ W
4 Y, u$ x+ {) \3 @
#define SHAER_RAM_BASE_ADDR    (0x80000000)     X" K- k9 ^  A: Z) N- u

3 P8 N. z9 \- [4 z. stypedef struct* e; p5 P( h5 j) k
{
) U) K- Q6 [; \9 _) r) a4 ?        unsigned int a;- t8 {3 {7 e3 j# w  I" }
        unsigned int b;
9 g0 a  r+ s0 e        unsigned int packet_cout;
$ M9 a, j7 e3 U5 o}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
, r/ o, x4 \1 w4 ~+ u( A- k# r6 P5 [& }$ ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);6 E; E. v2 p/ I4 u+ `# {' f$ }0 O0 o' M
unsigned int count_copy = 0;
9 W" s  H* W4 l# |6 [! [  r7 \/ F0 R! |+ Z6 B# U
3 V8 K# \; t4 x5 k6 _
int main()" O, u7 o' M+ o, k
{
7 ^' A1 H, r/ A2 @        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 O+ P- N; e8 ?) \! N: h% F- K        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; p. f8 m" ^, X- z$ S( ]8 E' T

, C+ D; H0 W2 k        while(1)
+ t3 W& p; r& E7 o# V' A        {7 `: j4 u7 }. ~) u+ D* }
                read_MSG_buffer(pshreRAM);
$ \- O; d# B8 H        }               
6 {/ \3 r% w6 u, E" l}. h$ {1 Z+ ]6 g% q
- l. N& I9 U9 k9 a) s: U
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- D9 ]: U4 J, r" C9 W
{
- X, R2 N% q# g! L8 K6 _/ i        RX_MSG_PROTOCOL buf;
) G9 o  L+ |5 o; h4 N        
0 H3 l6 t9 Y) A1 f( P        buf.a = pshreRAM->a;* _! r" i* e7 \3 i
        buf.b = pshreRAM->b;
4 }# k% k. N& c# _+ _8 l        buf.packet_cout = pshreRAM->packet_cout;" D7 o% I! S7 p: `
        
& v5 j2 S- u' i/ F        if(buf.packet_cout != count_copy)
* _" N# S- {+ r: G7 l5 V  C* L4 x        {8 J! H* }% c  h: v  E6 G+ m/ K
                printf("a is %d\n", buf.a);
8 l7 V- r4 u& T3 q; R                printf("b is %d\n", buf.b);
2 a# X% t0 H/ O5 W$ T/ X                printf("count is %d\n", buf.packet_cout);) r9 D' G. S4 ?
                count_copy = buf.packet_cout;
' ]; R) p: D2 Y5 z2 Z% e' f        }
4 }; K3 N. W. q( S' j        else
% |# j" R% f% s" p& m4 R        {
) h! Z, K! I5 E, n: e/ G4 W; e9 h                printf("No effective message!");
. Q7 f4 o% N+ h3 i6 r        }
( B' ~3 l* B9 q2 i- V1 B) n}
/ B/ m. ]6 h7 _0 Q! Y( @3 s" y# d7 q7 `/ W4 i' B2 x
. O3 K9 z" h1 J: `/ b# `3 X* C. u3 S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。/ A. E) b+ ^4 g
使用下面代码,对内存使用了mmap函数后:
& K- f" b1 u8 u  g% k#include <stdio.h>
/ @  ~: {5 N! ^6 }8 g) x- H#include <unistd.h>
- r8 s1 y  O/ `7 Z* D#include <sys/mman.h>! w7 ~- F5 M4 b) l1 k
#include <sys/types.h>
7 t6 r2 X) O  p/ _: d& z7 E7 R( j" W#include <fcntl.h>
/ c+ {! l) Z6 n# I4 A
" Z3 s9 g& _/ q3 B) B#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 f' u7 K: y$ q& `#define SHAER_RAM_SIZE         (0x20000)   
, I9 H$ j: z" Q3 ]7 ~
; M7 T8 ?+ Q& P# Btypedef struct* w' Y" v$ P) N* n; b0 T
{4 I3 o' t, N* i1 Y+ v% ~
        unsigned int a;/ Z/ d- g% Y2 |# z6 ^# F; T: l
        unsigned int b;
8 |- K: O7 U) b' P' ^        unsigned int packet_cout;* }6 n2 b0 U! M* X1 F( D4 d# b& n+ k
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 ?& T2 s) o! a% |! S# ?
. d1 J5 [- ^% ovoid read_MSG_buffer(int *baseaddr);$ f* ~0 @  P% ]* Y* h: i7 S
unsigned int count_copy = 0;
6 p- [# h$ }* Y' A1 [% Y; b' Y' _6 l$ V
0 E2 M6 z; Q' c5 S+ [int main()+ K8 z! m  _8 J! O  h) x
{
$ \% M9 Z$ J3 D! w% b+ O7 ^# v        int fd;
5 W* v- i  N( ?0 p+ V$ ]        int *mem = NULL;: x+ L4 F3 C0 Z$ S' N

0 R0 {7 j, I! G' k- H" I: x" \        if((fd = open("/dev/mem", O_RDWR)) <0)7 Q, s$ l8 @1 R+ i" s) I- a4 t
        {5 K9 }& y% Q' V( o% O
                perror("open error");
  o4 h# v( u% M, q- E1 j7 y                return -1;1 f# A  V7 |( D: ?+ l
        }
' _- D. t8 W& q. M- a8 d$ V        
. v" l+ ^4 e) [. T( k* n        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);0 \/ ]3 }7 z% w: G2 W5 N2 U7 r

* |: R* h' y$ I7 s5 a        while(1)
) y( j, b5 ?; T        {. j# x- ]3 j% t, T. L. q4 \
                read_MSG_buffer(mem);
6 Z6 a  x9 S5 Y: N# C  C2 y        }               
* D9 Z; X+ Z2 t- ]* H# i! ?}9 q6 D, Y& O: P3 S, `1 ~
) f% Q  S9 M( O; u9 ^9 ^
void read_MSG_buffer(int *baseaddr)
- f) B2 [' S- p3 T{" f8 J! |1 X- B
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 N8 q* X7 {3 R+ ^7 N
! W* m, y' P1 n- w  y) ^- S/ q
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;5 ?) [4 X) u: c2 R( ^

2 Z. i6 [/ b3 j' A, d5 \        if(pshreRAM->packet_cout != count_copy)1 [: {2 R" o3 k; L
        {; ~/ M% k7 ~; G4 t
                printf("a is %d\n", pshreRAM->a);
7 K5 Y# Z3 ^* f1 A                printf("b is %d\n", pshreRAM->b);% F5 F/ [/ C! O( b
                printf("count is %d\n", pshreRAM->packet_cout);
& I5 X0 [' {3 Z# W8 ?& F$ u& w, U. Y                count_copy = pshreRAM->packet_cout;
  e4 }9 C& e: p$ N4 f4 N: d5 C        }
: I! T& A" R# `! t# Q        else
* W8 Z6 M9 c+ t, P        {
, p: q  v% m: `' e4 Z                printf("No effective message!\n");# p% ^3 L$ Y+ l$ T3 F
        }
6 g' u; u$ z7 m- C6 J/ m}+ i0 j, m* U/ S1 i
4 e. J; X( C4 p/ N
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???& R) V9 U, Q5 M- h3 n# K) @

7 H* w$ {7 H  n. B: x* v3 m! S1 n$ U; B$ F) V

  H5 L& c2 i) Y9 i; V% i1 X6 Z; a7 r/ b0 h( |# B9 @* M
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-4-6 00:07 , Processed in 0.039031 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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