OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
) ^1 x5 v# {3 e5 ~; |
* ^9 U$ o7 }! G  ?) OOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>* N5 T7 f9 i5 L* Q
#include <unistd.h>& }, u" e9 n' B9 j9 s; K
#include <sys/mman.h>
$ i3 c+ n% }1 B. e. r! O; S3 p2 u#include <sys/types.h>
; j8 h8 y( X* J#include <fcntl.h>- N! ]/ e/ X8 ~5 u" @0 k* `5 ^' O
8 n3 D- Z- T3 }; T+ U9 C* b; L6 x
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : j1 o" D" W* {  b" F+ S

7 [5 P! m7 g1 k) S: ^1 ]typedef struct
7 q4 @/ R: A$ D. ^  d{8 v5 x1 t8 g& Q' E/ U1 v$ c
        unsigned int a;
* Z" n1 C; V% e3 v4 D' y$ N        unsigned int b;. t* K5 a& S$ d% C$ _. M
        unsigned int packet_cout;
8 B7 k% Q* o0 _* Z7 f( b4 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# k1 E( @' l0 j' S9 D/ A: s! o5 ]- f0 p7 G+ X" C) ^
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);) N, ^2 e5 m  S0 |( k( X' A* `
unsigned int count_copy = 0;/ S( _/ D7 E) J8 n, p$ P/ r

( p% Q$ Q: A; ~* B# |4 V" L
8 P. f% m2 |! G1 ~int main()8 y- p/ j* K& Y
{, H/ |! E; V' [' _
        pRX_MSG_PROTOCOL pshreRAM = NULL;, P7 u/ R6 g' o) k
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! C* r9 a7 }; d' o& g0 X$ G( {! M9 o0 ~: g
        while(1)
2 h8 [) D  ~: u) j& A# R        {
0 L4 R9 E' _2 o                read_MSG_buffer(pshreRAM);
5 y0 |% q* C4 Y6 M# A, G        }                + x, G4 p1 U  e) }# R! n7 s
}
5 X$ V3 e+ ^0 ?2 t9 w/ P- d8 b; M" t) [* }0 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 T" X1 |6 y' f8 y( T{2 Y$ C$ g7 {9 }$ ?% E2 {1 \1 o
        RX_MSG_PROTOCOL buf;7 V: g: _- y/ U. g5 G0 o
        ( \6 u3 `5 o1 ~
        buf.a = pshreRAM->a;7 f' Y/ Q/ ]! w$ w3 q6 W8 @3 I
        buf.b = pshreRAM->b;8 i! j2 d7 C& T$ Z5 T' K6 Q) `
        buf.packet_cout = pshreRAM->packet_cout;6 Y, G5 b& X' {' v, q6 R1 Z
        4 E6 M* E9 f4 b+ b  K- S* O* |
        if(buf.packet_cout != count_copy)
; ]4 f- ]$ e$ [9 D& i4 o: ~        {
: F8 ^) O' F3 {                printf("a is %d\n", buf.a);
9 a7 |( G- d8 l. J! K                printf("b is %d\n", buf.b);2 |! H1 W6 w2 N! k. V
                printf("count is %d\n", buf.packet_cout);( B; s% B% I( |$ j; v% {2 r
                count_copy = buf.packet_cout;4 y6 \9 Z+ C5 S% f# C
        }0 a7 \& _- [# v% x: |/ q- `
        else5 u. `  G$ L3 H+ r
        {
' v5 `" Y) \$ w2 s6 H+ g                printf("No effective message!");8 X) b8 Y0 [+ B; x6 m
        }/ G  E3 z. S2 s' b. q  _; M& ?& v
}. h: V0 x5 b! [/ W1 o

+ c- U9 N- Y6 x# E% q4 X6 }0 u$ Q6 e# U# y0 [5 ]  B
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; I  R8 j, y: I6 K3 @使用下面代码,对内存使用了mmap函数后:
, F) `/ X5 z: E& v# h#include <stdio.h>) S; g) i, [$ N' U4 R, z/ Q
#include <unistd.h>2 s% a, a0 F6 C: ~9 w
#include <sys/mman.h>
* c4 I4 [3 P9 S/ \#include <sys/types.h>
* G9 ?; [3 q' d0 z! x#include <fcntl.h>  {# C1 J2 \0 j; h2 h

" G1 l; N3 b) S#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 L( D' p- u3 a2 C9 m#define SHAER_RAM_SIZE         (0x20000)   ; U+ L8 c+ }8 a; |: x& x

6 J4 ]9 z" e# k6 e3 btypedef struct
) w, c4 B" ^% V/ P( D8 {{
7 s$ W! E) d; L' G2 @6 Q5 N: x        unsigned int a;
8 {# m4 Q' J3 Z! M8 c# |" R        unsigned int b;
- s" q5 a% N- C+ `  V$ N        unsigned int packet_cout;
3 R, P4 K6 f5 E" w}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& q. t% g% Q3 i" H- H  b
9 N5 \# X7 H6 o0 `  qvoid read_MSG_buffer(int *baseaddr);- V, |2 l: o1 i8 A6 [+ c* x& O7 J
unsigned int count_copy = 0;" {; Z" Q- ^7 W3 q* a- e* ~) \1 R$ A7 j

# o! I% g* A$ c# C9 Z0 Y6 l3 [' pint main()
" Z, F8 M0 |  l# z  M1 c{
5 S8 o* {4 `! R4 j8 k: H% v        int fd;
8 ]6 S% P* S/ d        int *mem = NULL;4 S, K8 F  y, ^6 a1 x; X

3 }; o* n- E5 C, }  h, j/ v        if((fd = open("/dev/mem", O_RDWR)) <0)6 n* r! d' E# l7 O' j
        {1 i4 `8 }/ X' C. @! x
                perror("open error");2 M+ t8 s: _% j5 h7 X5 S
                return -1;) G5 w7 X( [( s! m% o
        }
: p- g2 o1 ^: [. b# g$ D        / t- I. C: t9 u0 F! O" S
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);3 p$ O9 S  r" n" T9 L) L. y

( W5 W3 H6 F4 v! k: i( _        while(1)5 p& w8 L) M. |, n9 N
        {, z2 e# h: l  N. x$ W# e0 L
                read_MSG_buffer(mem);7 Z$ O1 \! L" I9 c' h7 D7 o
        }                - a9 {. p  T- h$ n( e* |6 a' j
}7 G( L7 q0 B8 f$ `2 c) C6 U- X, U' h
/ |9 m3 `1 v* L* m: n6 t# V" R
void read_MSG_buffer(int *baseaddr)
0 E- d5 g5 t$ R& Z( O. F{
0 X8 m2 R7 q& E8 I/ C        pRX_MSG_PROTOCOL pshreRAM = NULL;9 T9 s/ L4 F0 M) \4 l" i

: D! _* V2 t* e+ B4 I' m        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
! v0 K- f" d. b1 @7 k5 m
& m- E( _0 j# F        if(pshreRAM->packet_cout != count_copy)3 W' \8 j' ^) V& A3 [
        {
1 E! z5 `" X% O6 c                printf("a is %d\n", pshreRAM->a);
- ?; G& N0 H! Q                printf("b is %d\n", pshreRAM->b);
8 x. G  q- a4 h. l! q                printf("count is %d\n", pshreRAM->packet_cout);7 ]8 X& O6 W. \# ?2 ~  [
                count_copy = pshreRAM->packet_cout;
- A3 f2 X+ P8 A, d: T+ x1 \        }; `( g+ [* R3 @' S
        else
/ @# E! n6 [% Z        {
" y4 f/ U8 _/ h) H: Y' s9 D1 \                printf("No effective message!\n");
4 t# d+ r1 s* W        }- M& I2 R/ P1 D' R* P: v
}
1 u$ L. P& R( i
, i- D, V3 @# u; C% {1 G/ L1 P# h没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
  v. \' E+ B' j, q' I
# x& q8 I+ I% q9 a( q3 ~) B8 I; h7 B+ p7 R, `( ?8 C  K2 b: V& V
5 ?4 b+ s" b/ r
4 \) C* [+ }/ [' C* P! u
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-13 04:04 , Processed in 0.039244 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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