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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 5 S' N+ k( k. _! F' r. Y& U
5 e! d& n. J% l+ l  Y! ~7 m3 q
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>2 m# R' l5 I6 ]; Z( a5 \3 M) x$ P
#include <unistd.h>7 f1 ~: m; @, j. j5 i
#include <sys/mman.h>
8 I0 f9 q- t; V; m#include <sys/types.h>
* ^5 d' |. I( H4 S; D#include <fcntl.h>/ B0 j, r* i3 a! n  M4 f4 [. g
& L; l0 _2 A$ N, M* x8 J
#define SHAER_RAM_BASE_ADDR    (0x80000000)   - P2 H- F7 O4 h8 v! c+ T

( v0 d  A/ J4 w1 Z9 ]# n5 }typedef struct$ L. e# ~8 J/ ]4 p; c$ F
{, j  r8 o9 N% h2 J- F9 c
        unsigned int a;; I  C( c" ]% B9 }
        unsigned int b;
: f/ h( H& i8 P8 d9 ?        unsigned int packet_cout;* W  J$ G" {+ \5 m
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" Z2 g+ A& p& ?+ x
( N0 x6 ^, @0 [$ |. C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
! m3 S; {( c8 e- E, P$ \unsigned int count_copy = 0;7 L1 S1 E" l5 T5 a4 E( J
  G5 P- L, t' J7 g/ w4 \" T* H
5 M0 b( P% b* B+ n6 ~
int main()
0 m- W, M) R& U6 q' K{4 G3 _' A; v) _: @1 {, v
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 M. O, Z+ S. X, ?; B
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
! [0 A3 v2 Z% ?) k; q4 ]. k: N
& t* N. v3 M# ~& v. P! D9 {' b        while(1)
2 D* F. N4 I8 [+ R6 Q        {
$ m, {  ~$ O/ U) L! \                read_MSG_buffer(pshreRAM);8 W" }; ?. p' N* d6 p
        }               
4 r' Q- Z3 ]6 u/ `/ V% S. o5 X3 a}8 c5 B- V0 o- p" c# ~

. w8 Q1 C/ M. b3 }/ gvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 F0 T6 a) F+ f8 D& {/ |
{
  E9 L8 Y( Q% F9 R: `# X        RX_MSG_PROTOCOL buf;
  O0 W, A- o) }) K, p  `        
: O$ @' l! W: K0 `  R0 }# J        buf.a = pshreRAM->a;$ s7 F% j  K% I8 q6 R" T
        buf.b = pshreRAM->b;% }+ N. ?7 c( t/ `+ z- J: U# D
        buf.packet_cout = pshreRAM->packet_cout;
; x  L7 K1 Y' ]9 \( S) J2 Z        
4 x7 ]% N% }9 v, ~. W* ~        if(buf.packet_cout != count_copy)
5 N% R4 Y, K9 ]7 v, `+ e0 t* n6 \8 D        {! u5 Q, s4 d& R- n1 e7 a4 B, ~
                printf("a is %d\n", buf.a);
9 ~+ }3 I$ _& G& x                printf("b is %d\n", buf.b);
6 D1 @6 J3 K3 E% l                printf("count is %d\n", buf.packet_cout);+ X& ~% w8 S. T$ Y- L- ?) k
                count_copy = buf.packet_cout;, ~, K9 P* C$ t) M0 X& E, I
        }
  k( l6 Z7 e+ k' q8 I) l5 ^: G$ ^        else
( l/ c: i9 Y) t; r6 Z+ Y        {
( ~1 c! }5 J7 j3 k* Z, ]$ v% K0 R                printf("No effective message!");& c* M! r( |# c4 E+ R" }& ?
        }; c" D( n; T2 m" R- x1 |
}0 _! k! W' @5 J
0 x3 @  h% ?* Z5 s- }$ c3 r+ I* @
, R" O3 {  V) {+ H* y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 I; S! [' {6 ~* U9 u9 z使用下面代码,对内存使用了mmap函数后:! e, f1 N; D) D- n4 G
#include <stdio.h>! a, j( F; \; A. N" U
#include <unistd.h>
0 @2 u6 r; ~  M; h0 W) P& ?' v#include <sys/mman.h>9 C6 s8 Q& e' q8 ?/ l7 l, g
#include <sys/types.h>! K  i' m4 [. Q7 {) R2 e% S, y
#include <fcntl.h>) r5 C& v/ J) J' t# O7 `) d$ \
/ ]% K! v0 |9 X& f/ n( o; `( M# |
#define SHAER_RAM_BASE_ADDR    (0x80000000); c! P4 z! S1 I( P3 d% J
#define SHAER_RAM_SIZE         (0x20000)     Q7 {( [$ R! I4 G: w3 E3 y% f
( Y" P% v9 g/ I! \# G
typedef struct( R# J4 n4 o; f( L% S2 F
{$ y4 Z1 |' H) ]( o5 \' `; D* p
        unsigned int a;
' m) Z" |' j7 r$ l# O$ i        unsigned int b;7 A: C& \5 O6 m5 T0 {/ _1 ^
        unsigned int packet_cout;
8 q, r* f. k4 k9 |" U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
5 m/ t1 c4 d$ [' h- I  }) n& W8 ]; h, P  o' a5 G2 {
void read_MSG_buffer(int *baseaddr);
$ @6 Q; k$ O( e% a4 f$ x  nunsigned int count_copy = 0;
! q( ]0 ^4 ]* v$ g0 F3 L
8 ?- j( `' m+ V. {) U7 Fint main()3 r  k1 H* q5 g/ }# s( v' A" t
{
, n4 l& e: m  ^8 \" h+ |        int fd;
# P$ v! s" x, E: W- I& z. C$ h9 W) E        int *mem = NULL;% A0 x0 q% n6 G

6 \( L- n/ @- B( I& `        if((fd = open("/dev/mem", O_RDWR)) <0)
9 b$ w3 ^, ~! o# K        {
  u: A# K0 `& |$ i1 ]' y                perror("open error");7 K7 P/ u4 |& T4 P4 W
                return -1;7 p1 F7 G+ A/ F1 G% _& f, {
        }
9 \6 Q& F/ N* {  c        
. G$ h, `2 d: H7 V        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
$ t, P) V+ Q/ q% X( K8 R* A. S) {# |% p) s
        while(1)& e/ U; ]' w! q/ z, }5 g+ k$ j
        {
- U& L6 a/ T9 S' ~8 }1 T( U" P                read_MSG_buffer(mem);
( S$ n6 h$ s4 l* i+ [. S# j8 ?        }               
$ B5 ^- d( Z" S: N$ _# Z}. F3 S' p) n0 G& O
1 }5 E& ~. i; c9 B
void read_MSG_buffer(int *baseaddr)
8 K' g, X+ W6 s& a0 J{7 `( o" w- L  Q! E  M) `
        pRX_MSG_PROTOCOL pshreRAM = NULL;/ j+ z6 ]6 Y' e* z
$ C' g' a+ \! b) L% C& Z2 z5 c
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* L0 f$ p9 g3 Z5 K7 j8 G1 [+ v* p" h; r$ I( U7 f+ r
        if(pshreRAM->packet_cout != count_copy)
& C2 A$ a# y; u& ]' B, y3 |+ K        {
$ @6 ~9 v9 u- l" a+ V( j                printf("a is %d\n", pshreRAM->a);
# h& G! o6 |, W                printf("b is %d\n", pshreRAM->b);1 O) e7 G) J) C7 }
                printf("count is %d\n", pshreRAM->packet_cout);, Q) T2 \1 Y" i3 W& k8 n
                count_copy = pshreRAM->packet_cout;% [* k4 D( [. O  o! ^6 i
        }
/ ]' s2 B: D3 ]% n7 B3 I7 I" ?        else. i1 d9 [" s2 l
        {' W: g; ?" I% Q, Z) G
                printf("No effective message!\n");" ]5 |. g% x: ~4 H( D  e- {
        }; g+ e+ }* R4 a9 w, d
}
. Y& O. ~4 Q7 j  ]( ?7 ]" g5 H# ]3 a- K' N4 O( e0 [
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
, X/ Q- O4 T# H; Y4 T; h) g- e7 \' U

- f9 h+ C: n: V: t
; K* O* Q1 \% j( Q9 B
' S( \5 q" X  F6 b# z' y; \
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-26 22:49 , Processed in 0.037284 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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