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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 1 @$ m* R' N& R% ]* P. v5 a
1 S, ^7 m" w+ _1 [0 P# v, D
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>8 V/ E5 f: b2 _& K- q  Z% `2 }; w
#include <unistd.h>
* u) |9 J9 E" D#include <sys/mman.h>% |6 o4 P& d/ f/ h. e8 V
#include <sys/types.h># C  z; D/ A# d$ @6 I; s
#include <fcntl.h>9 v" Y. e1 k8 m
9 w/ I& T! D( ]0 ^; U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   - i# q( R) w) J9 p( ]% }8 a8 N
" d$ P5 `+ r8 s- N$ W, Y3 f
typedef struct
6 k/ u8 {, w% c7 T1 @7 M- @{
7 e& E( C0 L; D7 A+ q        unsigned int a;
, T% U0 ?2 P" m8 C& T) v/ F' C) Z        unsigned int b;
# m; z" F( Q$ k$ a        unsigned int packet_cout;
! P% `5 U. Y- e" ^7 w; s$ A}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( {% r7 T) x) a" b: @  |: p, F  T

4 s( M3 \  Z  R2 {" uvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);+ C" j% L3 W4 d. O- }/ o3 K2 k! _
unsigned int count_copy = 0;
+ u. Y4 E& M* P) O5 Q, s- v2 h- b; {" l  ]
9 O8 _. U$ w: P7 k: V, m
int main()( S' E( @0 o2 P
{/ J( C7 n% Z7 G# R, g# A
        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 t/ a- R& b$ V, a        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;, w2 b; K* R+ ~6 t3 o
6 d% v! s0 Y* n8 d! x
        while(1)' ~3 J9 Q# j! `8 F$ g) E
        {% L' b$ g  |2 I) d% N
                read_MSG_buffer(pshreRAM);
; i8 ^0 O; {$ v. b0 g& @0 G! @$ W: Y        }               
* T$ R# r# ]$ v& ?1 I3 |}- C8 _% X8 E5 `
% k- C& ]$ {, o& T# d2 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ x; J/ z# m5 N' a1 u
{. r2 |5 ?; l0 E, p
        RX_MSG_PROTOCOL buf;- T* ^( o: E) a& D+ c, U* R1 u
        / T/ n. `; M' g1 k# k  j! l0 J
        buf.a = pshreRAM->a;; ~, [' c' Z/ e: s! V4 E6 j& u
        buf.b = pshreRAM->b;
) ]2 Z2 H" n9 L4 w        buf.packet_cout = pshreRAM->packet_cout;
* b/ @' T8 g$ w1 S# q9 c  g        0 P  |1 ~2 N7 w6 x) W- e+ X" S
        if(buf.packet_cout != count_copy)# J4 l1 X/ B* y+ u
        {! A  x$ ?; z! B( v+ P, Y
                printf("a is %d\n", buf.a);: p/ P/ v. k0 T" N+ {; t# |# h+ q% p
                printf("b is %d\n", buf.b);
4 ]' z; H: B& f. O( P+ |7 k                printf("count is %d\n", buf.packet_cout);$ q8 Z& B& k' z* V5 _
                count_copy = buf.packet_cout;7 ]3 {/ @, i% \4 U' ~
        }
$ v  A! r9 b" F' x2 [. R        else0 |6 m% b2 [9 G5 }
        {- C2 i0 K0 J  `4 A( l3 O3 k) r
                printf("No effective message!");
+ i& D0 g8 h5 I$ k) |2 \        }6 R: q8 c  g& L: B2 t0 I( \0 `* U
}
/ E2 ]% a# _' p1 C
9 b" ~  @2 t' _% T" H' M; l+ m
5 F! V# [2 W! J. A但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
: N9 q+ c! i) s. ?; Y, S) o5 w使用下面代码,对内存使用了mmap函数后:
: E' J( X0 J" C# F. Y, P$ M0 C#include <stdio.h>1 A' j. F( D2 W: T8 q0 z' l
#include <unistd.h>; u3 i1 B# h3 _8 _: V+ n
#include <sys/mman.h>- [( p6 \' w: t* a
#include <sys/types.h>
4 b; C% [. f0 R1 w, _, L- ^& R( h1 ?#include <fcntl.h>$ m$ |) L: p# m/ [4 B

# K; e# v& {- s! M+ P#define SHAER_RAM_BASE_ADDR    (0x80000000)
6 b" `, ^5 P9 b6 j0 M6 H#define SHAER_RAM_SIZE         (0x20000)   
5 I  Z( b* x0 P5 X6 `; u% x" _) @% ?/ ^; O" @% x
typedef struct
% e3 i! T9 B* t3 r5 {8 c1 x) Z3 S{1 e; D. n$ L6 g, E7 ]' }0 Q: M0 x/ `
        unsigned int a;4 S) \0 h) A5 l% s: _+ I
        unsigned int b;
" F2 r9 ~( a/ x- T/ L! w        unsigned int packet_cout;* @6 b% K( u8 z" p3 l( G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 H6 c' ]$ b! O/ b/ ~0 M
: v0 R& f! k" t) B. I: [void read_MSG_buffer(int *baseaddr);- E. o" V, z* E& k1 r! t  b
unsigned int count_copy = 0;1 o" Y3 F! l  Y& |  d# t

; G& K% a* K* y6 f" w$ f0 rint main()3 k% W: i8 [4 x. q: a
{7 e# u* a4 z6 M
        int fd;
0 U" F) n. }' w$ [& y9 J" d        int *mem = NULL;# K4 s, T8 x9 U/ I, ?. n; ?) e
( P4 N" Y+ b& A  P$ n6 ~- I/ h! Q$ M
        if((fd = open("/dev/mem", O_RDWR)) <0); C  u# r- {; T% u
        {
: l2 Z1 F  o. z( [7 r5 y                perror("open error");
1 X1 `; U! R8 M7 y                return -1;# F3 B& v5 R  L
        }
9 M* C* ^- |% i( t, Q        
3 g, \  x1 c8 `1 V# T6 ^* Z        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);. k5 n" B8 Y3 L

% d! _! x  V: H& y        while(1)
' P0 e7 C. z3 k$ U( N7 H0 a# ~2 x        {
6 L) U" L: z2 P9 d                read_MSG_buffer(mem);8 b$ X% A0 l$ ^
        }                0 H% d8 g- h/ m/ O
}
2 f# H2 K* Q# p7 A( C, f) n; g0 p: J5 `  E+ i
void read_MSG_buffer(int *baseaddr)  I6 L) t3 j  X; n0 z& j! W3 f
{
: S3 c: r! S8 u0 W. x        pRX_MSG_PROTOCOL pshreRAM = NULL;
  v- W' T* d/ [  G; b2 E2 L
0 I" D2 k7 O( ^" S$ ~, V, p8 F) J- v        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
. q9 ?) [- e* J* \1 z$ H7 `
1 I2 r: ~0 \( J; l$ }        if(pshreRAM->packet_cout != count_copy)
7 ~" m' r# a; y$ }        {( X: ^3 u" v" x* G
                printf("a is %d\n", pshreRAM->a);+ D! d3 \# M% r" Y0 U3 N
                printf("b is %d\n", pshreRAM->b);4 J4 ?6 v3 q7 V0 V* m+ p' @, M! a
                printf("count is %d\n", pshreRAM->packet_cout);
5 y/ `9 P" Y( N; q                count_copy = pshreRAM->packet_cout;% B4 F0 t( i7 }
        }1 w, @4 X4 C8 L6 e* L& r
        else
7 T9 W% V) t- ]2 w6 F        {. z7 D' s' _& d
                printf("No effective message!\n");
" G. @' |2 C! U        }& G9 I: o& Y- O4 B9 b
}
2 N0 m: Y+ s; m" G! v
! v. T% D- M8 S" c+ ~% r没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???; }7 |9 n% |! Y4 [% P) \1 a$ E
* C; ]. o  X6 C& r  e7 |% O

8 Z/ Q1 }* J9 U9 U7 N+ ^
2 g; [- g) B9 X% O! {5 [$ o2 w% G- i4 r3 `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 14:50 , Processed in 0.041408 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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