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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- p) E$ L' ^" z! ^
+ H# A, n$ j: MOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h># a2 E7 x$ K: l/ _$ K. J: O
#include <unistd.h>% L& O& k& R9 g/ A3 ^" }* G
#include <sys/mman.h>6 L( u7 Y  f- F) Y  V+ y
#include <sys/types.h>8 g6 c2 q1 F$ J# U
#include <fcntl.h>2 R; o1 @* x4 f- F. j. z- y
! {2 i- n  \7 M
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
8 ^1 z0 L2 [0 W5 _1 Q3 M& X8 M7 K8 L9 i# X# C; c! K
typedef struct7 U$ E# M# n) D4 Z
{
. r# p; B; v0 D$ u4 t, m' l        unsigned int a;  i. C( B( J  S$ h5 \1 }
        unsigned int b;; u2 d+ z/ f" i9 ~- M# p
        unsigned int packet_cout;
" {3 f  M3 f8 }1 K. S) P/ t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;, B/ `) F) S5 f9 n
6 E* s. ^, Y% j; [3 M6 w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
, a3 M$ g* \; `unsigned int count_copy = 0;* N7 t) ?" M6 p7 ^0 E3 ^
  d( G! o8 m" }" @) x% d  f! k

" M9 U% d0 _3 a( t/ {1 b. Fint main()) `) R' k/ T9 _- x9 J
{
. A: X) Y% P: D8 Q! o4 N        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 k- v1 p' d! z: u3 b7 J4 s$ S( \        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 s7 C  Z! H- _, b: v
9 K' S! ?" z# j8 U6 X; l. l" W- g        while(1)
& `; I) o) n+ d% S" s+ R: T        {
# W+ Z2 N8 k6 p                read_MSG_buffer(pshreRAM);
4 m8 m" F1 j+ m1 v# P( j; H) O        }                % B" x- G6 `) C& t3 c8 v, \
}
9 L( ~* R5 {; O( J' ]3 k" w5 u- ^2 m* [4 W& d+ W7 F* r  \3 D" m
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)) m  x2 P$ D$ q+ N. N; ]
{; _1 S/ A  Y4 \1 L) Q8 ~4 M7 j
        RX_MSG_PROTOCOL buf;
  r+ ?, C& F2 R. H$ e: o        " P9 S. y/ r+ F! W3 ^) C
        buf.a = pshreRAM->a;/ {" ~5 i6 G# B. v- Z+ b9 z
        buf.b = pshreRAM->b;
, S% v+ G4 K7 N6 K3 }        buf.packet_cout = pshreRAM->packet_cout;
  R' m4 a6 {1 R& M' G* v        % K+ o$ h. L: l! t: C
        if(buf.packet_cout != count_copy), q1 z- _, a$ K, T- W; U! k* V$ J
        {7 E7 C: N! X' B" s
                printf("a is %d\n", buf.a);
3 U* k' n5 |! s  z1 }3 c% c                printf("b is %d\n", buf.b);# S# w) x: K# B
                printf("count is %d\n", buf.packet_cout);( J8 @2 z; Z; i0 p
                count_copy = buf.packet_cout;
4 |# u2 r/ `! o) ]1 b        }4 X5 Y! f0 [# @* ^  x8 U$ _
        else
% E- b" _7 i: s0 ?. m6 f) ~5 v' K        {
( F+ G0 [; ~# t8 U" Z                printf("No effective message!");
- O/ u( O9 ~( Q        }
$ |9 V+ ^: T4 y$ c) m" v$ ]}
6 c7 ]0 s% `/ E
7 {6 A7 K, n# j; q( E
! g$ n! w3 V5 s) e但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" b) S! _$ o8 Z" U5 b  O使用下面代码,对内存使用了mmap函数后:* }" B' w+ ]$ p
#include <stdio.h>: S; V- l7 ?1 Y
#include <unistd.h>+ Q7 S4 e4 e. I4 D, h. W5 E' E# n
#include <sys/mman.h>
# J! ~' s3 o$ N, U#include <sys/types.h>+ t3 p& C. Q: w9 T* a
#include <fcntl.h>
% v1 k8 ]! t5 M5 t1 R0 C, ?0 T; I- e" h6 j$ L2 O5 S
#define SHAER_RAM_BASE_ADDR    (0x80000000)* ~" l) g0 \4 m' T
#define SHAER_RAM_SIZE         (0x20000)   
0 Z/ b$ M8 p3 j' ^: u. P# M) d: v3 k7 @& p. ]) A/ Y
typedef struct
" |3 y: m+ h5 g: Q4 c+ ^4 b{# D  R. p4 Q+ h2 G" X
        unsigned int a;& C- N8 o9 r! }# K' H+ u
        unsigned int b;' |! R6 D+ K. n4 \
        unsigned int packet_cout;
, b# g) J7 W6 Z- x}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
: F+ D! r% n7 o1 e
4 B( Y+ j+ G2 l) G( Xvoid read_MSG_buffer(int *baseaddr);
! C" T2 x, v9 F0 `# [unsigned int count_copy = 0;
+ d3 o  k% f, B' h/ f# m$ W) h4 B% {
int main()
+ W; G- O% T5 Z1 x) S{
! }. r- t7 U$ P; @% J3 @' H        int fd;
4 W6 F& A% Q- r' S# e! Y        int *mem = NULL;
# g1 H4 p" M$ q4 x" g4 z  ?$ e) T& w
        if((fd = open("/dev/mem", O_RDWR)) <0)
) e! C& F, }" g# j( j6 S        {
, q  c2 [6 l0 r                perror("open error");
+ L+ V5 |; i1 c                return -1;1 ~6 T1 {5 e7 x( o  p
        }
- \4 N* g7 E/ I* b/ @9 T        . `9 e' p4 L  H1 {6 B- W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
8 x6 O6 y0 `6 ]! b* s7 W: H7 G7 [& T: k; u
        while(1)
* C( M( i7 r: f; [4 I        {0 D/ R/ s& j5 `" S3 o0 t
                read_MSG_buffer(mem);
8 G! V: t4 r/ p1 w4 I( N0 M3 t0 R        }               
- [! k3 n' z3 N/ _+ g. f}' [. l  ?6 J1 J- j, J3 t; e6 _- V
+ z" s. U6 C5 _# S3 K  A' T8 o7 V7 o
void read_MSG_buffer(int *baseaddr)# H' Y/ j0 M$ _$ P5 g  j
{% @- |; v3 z" O7 k1 Z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ D; D/ U, g4 J7 W& f' J; L: l+ g( P. `; f# L2 s$ E8 T6 w2 K
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
: ~$ Y- L8 X, D2 v. M' i; c6 q6 p, ^' {8 C
        if(pshreRAM->packet_cout != count_copy)* v* \& m+ p% h  |" r+ [0 P
        {
( H1 ]3 @3 r. h0 R7 N- H$ X                printf("a is %d\n", pshreRAM->a);
- s9 c8 y) J/ P                printf("b is %d\n", pshreRAM->b);6 t1 i. b) }2 o2 x- M/ e
                printf("count is %d\n", pshreRAM->packet_cout);( U9 o# b) i4 h4 a+ S5 o
                count_copy = pshreRAM->packet_cout;# P$ G, Z# o5 e0 l7 j7 C* I
        }) _5 c& Q$ E! D+ C$ d1 ~
        else
' k9 X8 ^3 d/ D/ @' U. j5 w  \        {
1 D. I# J- v) B3 \7 ^& p                printf("No effective message!\n");# k# p6 @0 _0 N# K7 [2 E
        }
1 S9 L# a. S" k. R/ f}
! s" H- ?2 B+ J) f! |1 K, T3 R2 e
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
- d  o5 q7 u/ m1 G# D( L; f( N4 Q7 c1 O! r' i
5 z, O/ B3 X  p( D5 v

# ~' J- H' f# A' U( N# _# ]/ [2 G3 u5 S4 P& V5 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-15 11:57 , Processed in 0.045086 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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