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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " `* n' u5 U" H2 h4 E) [1 I/ u+ n7 v

- K9 d) o; e8 G+ r  I3 G6 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>. c4 ^% |2 \* F' F
#include <unistd.h>
. x& p# C& I% I1 Z$ h" ]/ A( W, `. H#include <sys/mman.h>
& `9 l$ r4 L/ [+ Y$ p1 n  v) j/ n#include <sys/types.h>- A# E; q" N9 J4 z; F9 ~+ q
#include <fcntl.h>
6 G: m2 p: q5 J' a9 H% v3 G5 b. W* q: }( u
#define SHAER_RAM_BASE_ADDR    (0x80000000)   & o8 p" x9 w% M$ d. q( ~

- Q4 h8 ?. b5 Ttypedef struct
! K& i$ O4 y: v. g% m; J5 W{
7 S1 Y, G' B& D        unsigned int a;
' M" f* I; V1 Z: w+ \+ f8 Y        unsigned int b;
: p' k$ }. M( n/ i$ V# ?  ~        unsigned int packet_cout;; ]" R2 L* g; S" K& e0 r5 Q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  [1 \/ c) J' f. j( i  H$ p0 W8 `. ?- N/ K  f  k8 F
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 X4 a$ F! E+ l3 J: @
unsigned int count_copy = 0;
# N+ n) Y$ W, _2 g2 j2 _, C# t) G6 o8 t8 u$ D# z

1 ?7 i6 }5 o& x5 ]1 hint main()9 x5 S. f! |7 K, a
{- u! U8 S2 ~: c0 R- ~  y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ \  I$ Y$ o# i( V) V6 _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 i5 \% a, [$ F

/ d& h7 w3 @: u' m% f        while(1)
- H$ ^1 M$ q- d: A5 R" o        {
$ K% [0 j0 ^! I# X+ P: t' v9 s                read_MSG_buffer(pshreRAM);
* b0 v$ z  c% k# ?& e' w& d% _: ^        }               
, J4 f; E! d+ f% n" i8 h5 {}! F/ v' u% `: m* R* |: o+ Z

+ e3 @' d3 ?+ R9 tvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 p- k- _, R3 Q8 [
{5 J. K' P$ f: \2 p+ [
        RX_MSG_PROTOCOL buf;" p" N- N5 V5 D0 ?. r, {# _5 z
        
3 N% C! h1 o: D- |        buf.a = pshreRAM->a;
9 [6 l/ ]' B+ J% \# ~) \        buf.b = pshreRAM->b;
! T8 u+ |+ c) ~3 T5 d6 a! A        buf.packet_cout = pshreRAM->packet_cout;
( I/ l4 }/ |5 f        ) ]) U% j) W. o- ]5 E
        if(buf.packet_cout != count_copy)
6 ~4 i6 ]+ v* a2 W        {
3 q" U& ^" y: K! S                printf("a is %d\n", buf.a);
3 M3 t/ |8 G) |. O1 Q' |                printf("b is %d\n", buf.b);
8 y7 j/ |, ?0 ?4 Q                printf("count is %d\n", buf.packet_cout);
( P" C3 s9 }* N+ Q                count_copy = buf.packet_cout;; f: v5 M, u5 b
        }
$ i: W6 Y: |( ]/ I( p6 |2 b: C        else
9 K! N! I- N) P( g: n        {
0 K; l) x- b$ x" g. N) I; ~                printf("No effective message!");
  I2 t, \4 Y9 |" _) y) a        }! I3 m  A5 |" s2 q! U
}
4 L0 |% S% b/ N0 k# @& j- j" [7 U- J' u% W8 w, ~4 {
+ x3 \& J" g  Z; w, R& Z
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
9 @: r2 i7 z8 m2 C) b: x6 m  _1 N使用下面代码,对内存使用了mmap函数后:
5 Y7 G; |. E$ I# l/ E#include <stdio.h>$ t( M  Z. N$ v  B, B
#include <unistd.h>8 d' J8 I( e. o
#include <sys/mman.h>
3 d8 C. z2 r' `% h3 @* J7 ~$ A#include <sys/types.h>, b9 ], Y. K; L: N1 F! @  `! J
#include <fcntl.h>
  }7 n5 r" R' g. B* [9 y9 |2 p9 A4 I* U* o8 R, @7 n
#define SHAER_RAM_BASE_ADDR    (0x80000000); A  U; N/ n& F' m5 V. k3 ^  t5 T
#define SHAER_RAM_SIZE         (0x20000)   0 W% |' e% K! ?! n; [
1 w" a2 U+ r0 ]6 X7 f4 p4 x) t
typedef struct. u/ ]2 X& S* |/ y% P- t
{
8 c# H) D! D1 D        unsigned int a;# V3 u( V( f+ A- j& |" ?
        unsigned int b;) [% f$ L' p. ^+ Z# y. K7 ^
        unsigned int packet_cout;: z8 n' n9 i5 a) a: [& l1 Z* B
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
8 ]+ ?, D5 i8 o5 I" X# d
$ _: ?/ }  I6 x9 Vvoid read_MSG_buffer(int *baseaddr);
) d# e; @) ]& T% l: l, I9 Punsigned int count_copy = 0;
  |: a% N4 C: t6 k
# D; }' t% c$ @2 sint main()8 o7 ^5 E% R" x. U6 S
{
' i' t+ D& J* ?: {# P: I/ a# y! k        int fd;1 L' k) y8 s) B: d& x7 q
        int *mem = NULL;
$ ?  [, z& ^$ \) k
1 N4 ]" E# v' U- Z' K: ^        if((fd = open("/dev/mem", O_RDWR)) <0): Q% }4 ?; T( J' n
        {
  x$ y0 ^. a# A+ H* W1 |2 `                perror("open error");- N: ?" v! n+ V6 [8 n# S
                return -1;* a7 }% \4 V# O" w9 a
        }( Y8 b) B0 n1 T& ?; v3 R: B
        2 c9 `* V5 l8 |7 ^7 V& u( ^4 Z
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);, G7 F& Z6 m. o" F9 a! Q

9 [: j" l* c- I) ]        while(1)- {% {6 q$ F: b$ x
        {: `* V% K) o9 u* j8 ?
                read_MSG_buffer(mem);! \1 E6 }: d, X- u
        }               
6 s7 C+ T- J0 m$ @}
2 {3 W$ E( ?7 F" d! r, P
1 |7 _3 m/ p7 i: y* w; ^0 {& W& Bvoid read_MSG_buffer(int *baseaddr): [5 w4 A5 U$ |9 l- ^# e
{9 u% t, ^3 s9 b6 I0 e
        pRX_MSG_PROTOCOL pshreRAM = NULL;1 d+ O5 d1 B) E: e' x3 c5 M

& f% e& F* o) l) x% N        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: c! D8 a9 m8 n6 U% \5 ]8 g
3 h) K' `$ d( d' U: w        if(pshreRAM->packet_cout != count_copy)4 u2 n3 `0 X( {" p- ?+ G
        {: J" u" ]: Z: P* `% j) o6 ~# _/ o
                printf("a is %d\n", pshreRAM->a);
- K3 S& }& e$ L                printf("b is %d\n", pshreRAM->b);' Z4 w/ z8 S' S8 [% v
                printf("count is %d\n", pshreRAM->packet_cout);! _4 F& S# k, C8 ]$ M4 l  J
                count_copy = pshreRAM->packet_cout;$ z& y8 D. v# l7 `( _
        }2 J* b( h+ J2 u# z( G$ A
        else/ K5 R3 [; r  N, a: G$ Z3 [4 d
        {1 _3 b  D" H) G8 F- D
                printf("No effective message!\n");
9 H' ^8 Y7 e. r2 A9 b; l) ^        }& I/ _; Q0 A  s! x" P, Q' b
}# u# P2 k# x8 `& ~# z0 {/ N2 v; K

& u* n% G6 B$ o9 j没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???8 V" M6 W: F/ j) w$ e$ I) U0 b

- U$ x& m: Y2 U) R
, n; g/ ~2 g- [; e  P% E  {6 T1 a$ b3 _- d# R
$ u2 {: i0 j5 A5 H3 n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-10 12:38 , Processed in 0.039415 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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