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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 ~& I* I2 R) o9 f! h% |; u
; C2 ?' b1 b+ ^- _' i
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  U+ V- c: c3 v/ L( a+ W, Y+ v7 i( z
#include <unistd.h>. w& P# _: `( x: {, m9 ]) T& U: E
#include <sys/mman.h>
/ q" [8 o# w) Y7 c7 P#include <sys/types.h>
2 m, y9 B- @$ ?9 ~, {#include <fcntl.h>
' A' T# Y2 ?' n8 F* C( F( _" r2 @5 b
#define SHAER_RAM_BASE_ADDR    (0x80000000)   : J0 h' c$ |% N5 N% n
9 V$ O- p% O- ?& u
typedef struct1 j( z! W  m/ I) W% q
{: `$ a7 l1 |4 p% y9 x7 t  y( m
        unsigned int a;
  |0 d) L/ U7 u; ?+ `, D5 F        unsigned int b;+ W# Y8 V5 x. M/ ~* Q( M: ?4 a
        unsigned int packet_cout;
5 J4 \5 g5 N' V! e5 s, e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; s. g! M$ S7 G5 E: r" J- ]6 S0 u% j

( t# \, H$ A8 y, k7 {5 hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);: h$ G& O& [( ?7 ?
unsigned int count_copy = 0;. E$ f1 f* G. m9 [- B) Y* V

- |! K" n) J( C+ M& F
" ^( ]+ G; G1 I+ Q* m5 \0 {1 C% n" z; ]int main()
- u" S7 O8 U, ]5 Q7 p5 o1 o{
; _, b, |# j6 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
' I2 a" [; `3 B- o        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
: X1 y4 q, A9 h9 D$ e1 o9 {  V. }+ B
        while(1)
' Z6 u9 {- ?- `8 Z3 i; x        {( P/ Y2 k7 j' [
                read_MSG_buffer(pshreRAM);
% ?6 q% T" E/ Z! F: k        }               
' [; P) W8 J3 ^$ [& r, ^4 b8 Z}
: M% p9 p- u. Q* F1 G. w6 C" H/ f. v2 ~# @1 {7 h4 e
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)- I" k" c/ Y( w0 j
{
- b) r4 t2 [, D$ \) z: d8 ]        RX_MSG_PROTOCOL buf;
* x$ C8 L( N2 i4 K6 U; w        " P. X4 m  V3 i) q9 U+ I* u9 \
        buf.a = pshreRAM->a;
% ?' x9 C+ N+ a3 g; h2 d1 V) \! J8 F        buf.b = pshreRAM->b;
5 V* S0 R' l1 {- R- B$ m# R        buf.packet_cout = pshreRAM->packet_cout;7 {) b5 I8 @: A) b' P1 c- o: l
        4 Q, x5 V$ Z/ h) s8 V0 Z
        if(buf.packet_cout != count_copy)
0 i( S1 F( p( T' B0 X8 k2 M, r        {
6 K1 E1 N) C) e% y4 k9 N2 v                printf("a is %d\n", buf.a);; j/ [( m1 H) c  s, j  r! m
                printf("b is %d\n", buf.b);- }; T" G. v2 I2 a  G8 W3 s
                printf("count is %d\n", buf.packet_cout);, j+ O- J0 n$ [+ J+ w
                count_copy = buf.packet_cout;9 [, F5 t7 \- i
        }
3 B# R% q% P3 ]6 R7 d3 ?        else
$ p' M: `& a9 B0 `& S# o        {( v/ Z# b1 y+ g5 B3 \) F+ J! _
                printf("No effective message!");8 S# ~$ B  n9 I  X
        }
7 G+ w" @0 ^3 f+ c% j}
' b. U& P9 }5 `# O: R. ^6 J( B8 f, S
5 S+ p6 o" x8 Q$ Y% _
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。: A% i! x8 M4 C+ m* r, g" T2 ?
使用下面代码,对内存使用了mmap函数后:
( k# i; E6 k* q- _0 x#include <stdio.h>
8 T9 s0 V5 q# V) ]9 T# J4 O#include <unistd.h>  P+ a- h* U5 X. t% H8 v: ~! N
#include <sys/mman.h>, T: G, l( t7 P" B# k5 c9 l
#include <sys/types.h>
- a8 [% s0 M8 N1 P4 \#include <fcntl.h>, z% m- n; J6 |9 B; j
5 N" ?( Z, o' u, G- j3 c
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 c& V5 t2 x7 l8 W. ?1 ?#define SHAER_RAM_SIZE         (0x20000)   
5 `, g: k0 g- |
# |$ G' V# s$ V/ e& e$ ]% d. [typedef struct% b. O' n3 r- n" d" e7 s$ Y( e9 \
{, `6 M& @% y1 x7 `
        unsigned int a;9 }* n  X7 a( M! @, {9 `" E$ k, g
        unsigned int b;
7 u, u+ U8 R" F$ h0 x5 \' B0 y( W        unsigned int packet_cout;5 s8 \: Z# A/ Z7 B$ b1 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& D' R1 O. ]- [. A/ G

) s& G, ^2 O: d+ P( @2 j8 evoid read_MSG_buffer(int *baseaddr);5 Q5 f0 J/ f5 N5 c
unsigned int count_copy = 0;
! j( G4 ?) V7 R+ u* p7 b% M# u
3 z% n3 q& M1 B5 nint main()
  O( [: u2 d* K* k3 F0 d! d& f{0 C# {$ i6 y; s+ u
        int fd;4 n& I4 g. }7 t6 `, h
        int *mem = NULL;* J8 F) ?3 y3 A2 \

- l9 S* r: Z1 }: V4 Y% m        if((fd = open("/dev/mem", O_RDWR)) <0)
; m5 {! p- v6 O# ]& @        {2 y6 Z% [4 N* t- C) U) w
                perror("open error");4 O& y! z4 D! N$ n
                return -1;
. b$ ^4 L+ f1 c: L" u5 q4 Q        }+ _0 ^  D+ x. ]) r2 K! s
        
  _* l3 w5 i5 ^3 Z. Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
; S( }3 c8 S; @# P, @1 q9 }0 f8 j# m# L# n
        while(1)
- T9 J! u! w( K9 a3 k: I7 t        {
/ t6 H; [/ P0 c: I# I5 u7 m                read_MSG_buffer(mem);
6 ?! u* R% H; I# N        }                1 e1 A* J0 I# w5 E& Z9 Q
}% h9 ^- }' z) X. j& R1 o
$ p) K& g- S7 l- v) \& v
void read_MSG_buffer(int *baseaddr)
2 D# F& @  a0 }5 ^) u6 n{
# ?$ v( x' @0 Z$ v$ S5 p        pRX_MSG_PROTOCOL pshreRAM = NULL;  g9 @  G1 e: a' Y/ C( Q1 G

7 J$ f, F, {% G. F        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ U; k9 ^# `: w. a1 f' `3 W, g' l

- r$ q3 ?! h3 ^( V; {  T        if(pshreRAM->packet_cout != count_copy)9 t  V5 P  V8 y* p* |3 C% q4 a
        {
$ R% k. T% \, S6 ~$ W' d! S                printf("a is %d\n", pshreRAM->a);. x* ?5 P( W& G9 q1 k8 ?$ ?
                printf("b is %d\n", pshreRAM->b);$ P- ]/ q1 L" W6 I9 v
                printf("count is %d\n", pshreRAM->packet_cout);: F* q" e$ g1 H* _1 i
                count_copy = pshreRAM->packet_cout;
- i; O, h- C9 v! u% G        }$ @( G8 O8 s7 W" Z" Q; S
        else" |! X% s, E6 r* U. I# s  m6 U) s
        {2 b3 U- K6 a' x- I# W% g4 Q
                printf("No effective message!\n");2 O" f$ P, F+ X$ l% K, K6 ?2 k
        }3 ~3 ?$ o$ g. j. ~5 L5 |& \
}+ r, y3 k" j" @+ A$ m, a

- A3 |' H5 N& t% f7 V/ \" I没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
5 y& K. \4 N. |5 l8 X+ c. R( v- Q& o2 S  U  U' M6 [+ Z/ N

% C0 h5 R7 q1 N( l8 n8 M  a* R2 _
. ~) l" J  D  ^4 F9 U8 H4 b
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-27 03:48 , Processed in 0.039095 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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